home *** CD-ROM | disk | FTP | other *** search
/ Whiteline: delta / whiteline CD Series - delta.iso / progtool / c / egem_210 / egem / doku / manual.txt < prev   
Text File  |  1995-11-25  |  118KB  |  2,624 lines

  1.  
  2.  0. INHALT:
  3. ============
  4.  
  5.  I.   Allgemeine Hinweise
  6.  
  7.         1.  Übersetzung der Library mit Pure C, GNU-C und Lattice C
  8.               a. Pure C
  9.               b. GNU-C/Lattice C
  10.         2.  Nutzung der Library mit Pure C, GNU-C und Lattice C
  11.  
  12.  II.  Neue Möglichkeiten in Eingabefeldern
  13.  
  14.  III. erweiterte Objekt-Typen sowie Resource-Aufbau
  15.  
  16.         1.  Debugging
  17.         2.  Highbyte des Objekt-Typs
  18.  
  19.  IV.  Globale Variablen der Library
  20.  
  21.  V.   Funktionen, Strukturen und Konstanten der Library
  22.  
  23.         1.  Routinen zur Verwaltung des Cookie-Jars
  24.         2.  Routinen zur Verwaltung des Environments
  25.         3.  Erweiterte Objekt-Routinen (u.a. kompatibel zum PC-GEM 2.0)
  26.         4.  Erweiterte Rechteck-Routinen (u.a. kompatibel zum PC-GEM 2.0)
  27.         5.  VDI-Attribut- und Clipping-Funktionen
  28.         6.  Erweiterte Scrap-Directory-Routinen
  29.         7.  Erweiterte Grafik-Routinen
  30.         8.  Menü-Funktionen
  31.         9.  Dialog-Optionen und -optik setzen
  32.         10. Bibliothek (AES,VDI) sowie Resource (de-) initialisieren
  33.         11. Resource- und Objekt-Initialisierung
  34.         12. Ereignis-Auswertung
  35.         13. Dialog-Funktionen
  36.         14. Fenster-Funktionen
  37.         15. Popup-Funktion
  38.         16. XAcc-2- und AV-Protokoll-Funktionen
  39.         17. Drag & Drop-Funktionen
  40.         18. Auskunftsfunktionen
  41.         19. Datei-/Pfadfunktionen
  42.         20. Verschiedene Funktionen
  43.         21. Definitionen häufig benötigter (Protokoll-) Konstanten
  44.  
  45.  
  46.  I. Allgemeine Hinweise:
  47. =========================
  48.  
  49.  1. Übersetzung der Library mit Pure C, GNU-C und Lattice C
  50.     -------------------------------------------------------
  51.  
  52.     WICHTIG:
  53.     Bei der Übersetzung der Library darf keine Stack-Überprüfung aktiviert
  54.     sein, da einige Library-Funktionen (z.B. benutzerdefinierte Objekte) vom
  55.     AES aufgerufen werden und somit den AES-Stack verwenden.
  56.  
  57.     Light-Version:
  58.     --------------
  59.     Wird die Library mit definiertem Konstanten-Makro 'SMALL_EGEM' (s.a.
  60.     Projekt-Datei 'EGEMLGHT.PRJ' bzw. 'EGEMMNTL.PRJ') übersetzt, so sind
  61.     keine Eingaben in Dialogen (Edit-Felder) möglich und die Funktionen
  62.     ob_clear_edit() sowie ascii_box() stehen nicht zur Verfügung. Außer-
  63.     dem sind bei den erweiterten Objekttypen weniger Images vorhanden.
  64.     Sinn und Zweck ist, daß dadurch der Overhead durch die Library geringer
  65.     wird (u.a. bei Programmen, die z.B. nur erweiterte Alertboxen nutzen)
  66.  
  67.     a. Pure C
  68.  
  69.     EnhancedGEM läßt sich sowohl mit den Pure-C-Libraries als auch mit den
  70.     MiNT-Libraries ab Patchlevel 30 compilieren.
  71.     Hierzu muß jedoch im Header-File AESBIND.H der MiNT-Libraries die Zeile
  72.  
  73.     __EXTERN int    evnt_timer __PROTO((unsigned long Interval));
  74.  
  75.     in
  76.  
  77.     __EXTERN int    evnt_timer __PROTO((int Int_locount,int Int_hicount));
  78.  
  79.     geändert werden.
  80.     Weiterhin muß das Makro __MINT_LIB__ definiert werden (s. E_GEMMNT.PRJ)
  81.  
  82.     b. GNU-C/Lattice C
  83.  
  84.     Ebenfalls läßt sich EnhancedGEM mit GNU-C und Lattice C übersetzen,
  85.     wobei allerdings die MiNT-Library sowie die entsprechenden Makefiles
  86.     (Makefile.GCC bzw. Makefile.LCC) benutzt werden müssen. Eventuell auf-
  87.     tretende Warnungen bei der Übersetzung sind (hoffentlich) bedeutungslos.
  88.  
  89.  2. Nutzung der Library mit Pure C, GNU-C und Lattice C
  90.     -------------------------------------------------------
  91.  
  92.     a. Wurde EnhancedGEM mit Hilfe der MiNT-Libraries übersetzt, so MÜSSEN
  93.     die MiNT-Libraries und die dazugehörigen Header-Dateien auch benutzt wer-
  94.     den. Ansonsten sind die Reaktionen nicht vorhersehbar, aber höchstwahr-
  95.     scheinlich resultieren daraus Fehlfunktionen (außer evtl. bei GNU-C).
  96.  
  97.     b. Die Funktionen evnt_multi, EvntMulti (Pure C) sowie evnt_mesag des
  98.     AES sollten nicht mehr benutzt werden! Stattdessen sollte immer die
  99.     Funktion Event_Multi benutzt werden! Weitere Details zur Ereignisver-
  100.     arbeitung s. Funktionen Event_Multi() und Event_Handler().
  101.  
  102.     c. Alle internen, modulübergreifenden globalen Variablen und Funktionen
  103.     der Library beginnen mit einem Unterstrich '_', so daß es zu keinen
  104.     Überschneidungen kommen sollte.
  105.  
  106.  II. Neue Möglichkeiten in Eingabefeldern:
  107. ===========================================
  108.  
  109.     - zusätzliche Gültigkeitsmasken:
  110.         'c','C': Ziffern "0-9", Komma ".,", Rechenzeichen "+-*/^",
  111.                  Klammern "(){}[]"
  112.         'l','L': LED-Ziffern "0-9"
  113.         '<Ziffer>': Ziffer='0'-'9', alle Ziffern von '0' bis <Ziffer>, z.B.
  114.                  '1': Binärziffern '01'
  115.                  '7': Oktalziffernn '01234567'
  116.                  '9': Dezimalziffern '0123456789'
  117.         'h','H': Hexadezimalziffern "0-9A-F",
  118.                  Umwandlung in Klein/Großbuchstaben
  119.         'u','U': ASCII 32-127, Umwandlung in Klein-/Großbuchstaben
  120.         'v','V': ASCII 32-255, Umwandlung in Klein-/Großbuchstaben
  121.         'w','W': ASCII 32-127
  122.         'y','Y': ASCII 32-255
  123.  
  124.     - kleiner/großer System-Font können in Eingabefeldern benutzt
  125.       werden. Unterstützt das AES auch nicht-proportionale GDOS-Fonts,
  126.       so können diese ebenfalls in Eingabefeldern verwendet werden.
  127.  
  128.     - ein Eingabefeld darf maximal MAX_EDIT-Zeichen lang werden (ansonsten
  129.       muß die Konstante bei Bedarf in der Datei 'E_GEM.H' geändert und die
  130.       Library neu übersetzt werden)
  131.  
  132.     - Eingabefelder dürfen einen Klammeraffen '@' am Anfang besitzen
  133.  
  134.  III. erweiterte Objekt-Typen sowie Resource-Aufbau:
  135. =====================================================
  136.  
  137.     1. Debugging:
  138.     -------------
  139.  
  140.     Wird die Library mit definiertem Konstanten-Makro 'DEBUG' (s.a.
  141.     Projekt-Datei 'E_GEM.PRJ' bzw. 'E_GEMMNT.PRJ') übersetzt, so gibt die
  142.     Library Fehlermeldungen (Alert-Boxen) aus, wenn Fehler im Resource-
  143.     Aufbau gefunden wurden (z.B. doppelt vergebene Hotkeys, mehr als ein
  144.     Help-/Undo-/Default-Button usw.). Dabei werden die Art des Fehlers und
  145.     die Nummer des fehlerhaften Objekts ausgegeben.
  146.  
  147.     2. Highbyte des Objekt-Typs (s.a. STARTUP.RSC):
  148.     -----------------------------------------------
  149.  
  150.         TriState-Checkboxen:
  151.         --------------------
  152.  
  153.         Ist das Flag TOUCHEXIT bei einer Checkbox gesetzt, so kann die
  154.         Checkbox noch einen dritten Zustand (neben selektiert und nicht
  155.         selektiert) annehmen, bei dem das Innere der Checkbox mit einem
  156.         grauen Muster gezeichnet wird. In diesem Zustand ist der Status
  157.         CHECKED gesetzt.
  158.  
  159.         #define CHECKBOX        1   /* Check-Box */
  160.         #define HEADER          2   /* Überschrift */
  161.         #define RADIO           3   /* Radio-Button */
  162.         #define UNDERLINE       4   /* Unterstrich */
  163.         #define HOTKEY          5   /* Hotkey-Objekt */
  164.         #define CHKHOTKEY       6   /* Check-Box mit Hotkey */
  165.         #define RBHOTKEY        7   /* Radio-Button mit Hotkey */
  166.         #define INDHOTKEY       8   /* Hotkey-Objekt einer Check-Box oder
  167.                                        eines Radio-Buttons */
  168.         #define FLYDIAL         9   /* Flugecke */
  169.         #define TXTDEFAULT      10  /* Status des DEFAULT-Objekts ist von
  170.                                        diesem Text-Objekt abhängig */
  171.         #define USERFLY         11  /* beliebiges Flugobjekt */
  172.         #define HELP_BTN        12  /* Help-Button */
  173.  
  174.         GDOS-Fonts:
  175.         -----------
  176.  
  177.         Der erweiterte Objekttyp 'ATTR_TEXT' unterstützt auch die Ausgabe
  178.         von beliebigen, u.a. proportinalen GDOS-Fonts unabhängig vom
  179.         AES! Dabei müssen die Felder 'te_fontid', 'te_fontsize' der
  180.         TEDINFO-Struktur auf die ID und die Größe in Punkt des Fonts ge-
  181.         setzt werden. Außerdem muß das Feld 'te_font' auf eine der fol-
  182.         genden Konstanten gesetzt werden:
  183.  
  184.              #define GDOS_PROP    0 /* Speedo GDOS font */
  185.              #define GDOS_MONO    1 /* Speedo GDOS font, monospace */
  186.              #define GDOS_BITM    2 /* GDOS bit map font */
  187.  
  188.         Nach dem Initialisieren der Objekte durch fix_objects(), rsrc_calc()
  189.         oder rsrc_init() ist der Objekttyp auf 'G_XTEXT' gesetzt und die
  190.         Variable 'ob_spec' der OBJECT-Struktur zeigt auf einen benutzer-
  191.         definierten Block USERBLK, dessen Parameter 'ub_parm' auf folgende
  192.         Struktur zeigt, welche mit den Werten aus der Resource-Datei initia-
  193.         lisiert ist (ein evtl. vorhandenes EDITABLE-Flag wird gelöscht!):
  194.  
  195.         X_TEXT-Struktur:
  196.         ----------------
  197.  
  198.         typedef struct
  199.         {
  200.             /* Zeiger auf Text (sollte nur mit ob_get_text()/ob_set_text()
  201.                gesetzt oder ermittelt werden) */
  202.             char    *string;
  203.  
  204.             /* Font-ID, -höhe (<0: in Punkt, >0: in Pixel) */
  205.             int     font_id,font_size;
  206.  
  207.             /* Farbe (0-15, kann nachträglich auf beliebige VDI-Farbe
  208.                gesetzt werden) */
  209.             int     color;
  210.  
  211.             /* Zentrierung des Textes (TE_LEFT,TE_CNTR,TE_RIGHT) */
  212.             int     center;
  213.  
  214.             /* Schreibmodus (MD_REPLACE,MD_TRANS,MD_XOR,MD_ERASE) */
  215.             int     mode;
  216.  
  217.             /* Alle weiteren Variablen dieser Struktur sind für interne
  218.                Zwecke reserviert! */
  219.         } X_TEXT;
  220.  
  221.         #define ATTR_TEXT       13  /* Text mit Attributen */
  222.  
  223.         #define CYCLE_BUTTON    14  /* Cycle-Button */
  224.         #define ARROW_LEFT      15  /* Pfeil links */
  225.         #define ARROW_RIGHT     16  /* Pfeil rechts */
  226.         #define ARROW_UP        17  /* Pfeil hoch */
  227.         #define ARROW_DOWN      18  /* Pfeil runter */
  228.         #define UNDO_BTN        19  /* Undo-Button */
  229.  
  230.     Jedem Objekt können die erweiterten Typen UNDO_BTN, HELP_BTN, HEADER
  231.     und USERFLY zugeordnet werden. Bei ATTR_TEXT sowie TXTDEFAULT muß
  232.     es sich um ein Text-Objekt (auch G_STRING), bei UNDERLINE sollte es
  233.     sich um den Typ G_BOX handeln. Alle anderen erweiterten Typen
  234.     sollten (müssen aber nicht) dem Typ G_BOXCHAR zugeordnet werden.
  235.  
  236.         #define G_UNMODAL   0x4000  /* unmodales Objekt */
  237.         #define G_MODAL     0x8000  /* modales Objekt */
  238.  
  239.     Zusätzlich können alle (!) Objekte durch Setzen von Bit 14 (G_UNMODAL)
  240.     bzw. Bit 15 (G_MODAL) im Objekt-Typ (erweiterter Objekttyp mit 64 bzw.
  241.     128 verodern) zu einem unmodalen oder modalen Objekt deklariert werden,
  242.     welches nur in unmodalen bzw. modalen Dialogen erscheint.
  243.  
  244.     WICHTIG:
  245.     --------
  246.     Will man den Objekttyp ermitteln, so sollte man die Variable 'ob_type'
  247.     der OBJECT-Struktur mit der Konstante G_TYPE maskieren!
  248.  
  249.     Nach dem Initialisieren der Resource durch die Library werden der
  250.     Objekttyp und teilweise das obere Byte des Objektstatus der erweiterten
  251.     Objekte verändert. Ebenso zeigt 'ob_spec' meistens auf den USERBLK des
  252.     Objekts. Daher sollte man auf diese Variablen nicht mehr zugreifen,
  253.     sofern die Änderungen nicht dokumentiert sind (wie z.B. bei ATTR_TEXT)
  254.  
  255.     Weitere (Kombinations-) Möglichkeiten s.a. Beispielprogramm sowie
  256.     Startup-Resource (STARTUP.RSC).
  257.  
  258.     WICHTIG:
  259.     --------
  260.     Werden die Funktionen rsrc_calc() oder rsrc_init() mit der Größe des
  261.     Entwurfsfonts aufgerufen, so SOLLTEN nur Pull-Down-Menüs G_TITLE-
  262.     Objekte enthalten. Ansonsten wird der Dialog normal vom AES an die
  263.     Größe des System-Fonts skaliert.
  264.  
  265.  IV. Globale Variablen der Library:
  266. ====================================
  267.  
  268.     int _app;
  269.         -> Programm wurde als Applikation (_app!=0) oder Accessory (_app==0)
  270.            gestartet
  271.  
  272.     int ap_id:
  273.         -> Applikationsidentifikation (Rückgabewert von appl_init())
  274.            oder negativer Wert, wenn AES-Initialisierung nicht erfolg-
  275.            reich war
  276.  
  277.     int menu_id:
  278.         -> Nummer des Eintrags im Accessory-Menü oder negativer Wert
  279.  
  280.     int grhandle:
  281.         -> Handle der AES-Workstation (Rückgabewert von graf_handle)
  282.  
  283.     int x_handle:
  284.         -> Handle der Library-Workstation
  285.  
  286.     int gr_cw,gr_ch:
  287.         -> Breite/Höhe des System-Zeichensatzes (IBM) in Pixel
  288.  
  289.     int gr_bw,gr_bh:
  290.         -> Breite/Höhe eines Rechtecks, das jedes einzelne Zeichen
  291.            des System-Zeichensatzes (IBM) vollständig umgibt.
  292.  
  293.     int gr_sw,gr_sh:
  294.         -> Breite/Höhe des kleinen System-Zeichensatzes (SMALL) in Pixel
  295.  
  296.     int ibm_font,ibm_font_id;
  297.         -> Höhe des System-Zeichensatzes (IBM) in Punkt sowie Font-ID
  298.  
  299.     int small_font,small_font_id;
  300.         -> Höhe des kleinen System-Zeichensatzes (SMALL) in Punkt
  301.            sowie Font-ID
  302.  
  303.     int fonts_loaded;
  304.         -> GDOS-Fonts wurden geladen (werden die GDOS-Fonts von der
  305.            Anwendung geladen, so muß diese Variable auf einen Wert un-
  306.            gleich Null gesetzt oder die Fonts selbständig entfernt werden)
  307.  
  308.     int max_w,max_h:
  309.         -> Breite/Höhe des Bildschirms in Pixel
  310.  
  311.     int planes, colors:
  312.         -> Anzahl der Farbebenen sowie gleichzeitig darstellbaren
  313.            Farben
  314.  
  315.     int colors_available;
  316.         -> Anzahl der Farbabstufungen der Farbpalette
  317.            (2: monochrom, 0: mehr als 32767 Farben)
  318.  
  319.     MFDB *screen;
  320.         -> Memory Form Definition Block des Bildschirms
  321.  
  322.     GRECT desk;
  323.     VRECT clip;
  324.         -> Ausmaße des Desktop-Fensters als GRECT bzw. VRECT
  325.  
  326.     int aes_version:
  327.         -> AES-Versionsnummer
  328.  
  329.     int magx:
  330.         -> Versionsnummer von MagiC ab Version 2.00
  331.  
  332.     int winx:
  333.         -> Versionsnummer von Winx ab Version 2.10
  334.  
  335.     int mint:
  336.         -> MiNT-Versionsnummer
  337.  
  338.     int multi:
  339.         -> AES-Multitasking-Betriebssystem vorhanden
  340.  
  341.     int search:
  342.         -> appl_search()-Funktion vorhanden
  343.  
  344.     int AvServer;
  345.         -> Applikations-ID des AV-Protokoll-Servers oder negativer Wert
  346.  
  347.     int menu_available;
  348.         -> Anwendung darf eigene Drop-Down-Menüleiste anmelden
  349.            (menu_available!=0)
  350.  
  351.     OBJECT *iconified;
  352.         -> Zeiger auf Objektbaum, der für die Darstellung von ikonifizierten
  353.            Fenstern benutzt wird (ansonsten weißer Hintergrund des Fensters,
  354.            falls Zeiger nicht gesetzt wurde)
  355.  
  356.  V. Funktionen, Strukturen und Konstanten der Library:
  357. =======================================================
  358.  
  359.     1. Routinen zur Verwaltung des Cookie-Jars
  360.        ---------------------------------------
  361.  
  362.         COOKIE-Struktur:
  363.         ----------------
  364.             typedef struct
  365.             {
  366.                 long    cookie_id;      /* ID des Cookies */
  367.                 long    cookie_value;   /* Wert des Cookies */
  368.             } COOKIE;
  369.  
  370.         void create_cookie(COOKIE *cookie,long id,long value);
  371.             -> Cookie 'cookie' wird mit der Identifikation 'id' und
  372.                dem Wert 'value' initialisiert
  373.  
  374.         boolean new_cookie(COOKIE *cookie);
  375.             -> Cookie 'cookie' in Cookie-Jar einfügen (Rückgabewert
  376.                gleich FALSE, falls Cookie-Jar nicht existiert oder
  377.                keine freien Einträge mehr vorhanden sind)
  378.  
  379.         boolean get_cookie(long id,long *value);
  380.             -> Cookie mit der Identifikation 'id' im Cookie-Jar suchen
  381.                und Wert gegebenenfalls in der Variable '*value' sichern
  382.                (sofern value!=NULL)
  383.             -> Rückgabewert ungleich FALSE, wenn Cookie gefunden wurde
  384.  
  385.         void remove_cookie(long id);
  386.             -> Cookie mit der Identifikation 'id' aus dem Cookie-Jar
  387.                entfernen
  388.  
  389.         void move_cookiejar(long *new_cookie_jar,long size);
  390.             -> neuen Cookie-Jar 'new_cookie_jar' mit Platz für 'size'
  391.                Einträge anlegen und alten Cookie-Jar gegebenfalls
  392.                kopieren
  393.             -> neuer Cookie-Jar muß mindestens so viele Einträge wie
  394.                der alte Cookie-Jar haben
  395.  
  396.         long cookie_size(void);
  397.             -> Anzahl der maximalen Einträge im Cookie-Jar ermitteln
  398.  
  399.     2. Routinen zur Verwaltung des Environments
  400.        ----------------------------------------
  401.  
  402.         char *getenv(const char *entry);
  403.             -> Variable 'entry' im Environment suchen und im Erfolgsfall
  404.                Zeiger auf Wert der Variable zurückgeben (ansonsten NULL)
  405.  
  406.         int putenv(const char *entry);
  407.             -> Zeichenkette 'entry' ins Environment einfügen
  408.             -> Rückgabewert ungleich Null im Erfolgsfall
  409.  
  410.     3. Erweiterte Objekt-Routinen (u.a. kompatibel zum PC-GEM 2.0)
  411.        -----------------------------------------------------------
  412.  
  413.         void ob_dostate(OBJECT *tree,int object,int masc);
  414.             -> einzelne Bits 'masc' des Objektstatus des Objekts 'object'
  415.                im Baum 'tree' durch Veroderung setzen
  416.  
  417.         void ob_undostate(OBJECT *tree,int object,int masc);
  418.             -> einzelne Bits 'masc' des Objektstatus des Objekts 'object'
  419.                im Baum 'tree' durch Maskierung löschen
  420.  
  421.         int ob_isstate(OBJECT *tree,int object,int masc);
  422.             -> Bits 'masc' im Objektstatus des Objekts 'object' im Baum
  423.                'tree' testen
  424.             -> Rückgabewert:
  425.                TRUE (1):  alle Bits gesetzt
  426.                FALSE (0): Bits (teilweise) nicht gesetzt
  427.  
  428.         void ob_setstate(OBJECT *tree,int object,int state);
  429.             -> Objektstatus des Objekts 'object' im Baum 'tree' auf den
  430.                Wert 'state' setzen
  431.  
  432.         void ob_select(DIAINFO *info,OBJECT *tree,int object,int select,
  433.                        int draw)
  434.             -> Objekt 'object' im Baum 'tree' in Abhängigkeit des
  435.                Parameters 'select' (de-) selektieren und evtl. neuzeichnen
  436.                (draw!=0). Gehört der Objektbaum zu einem geöffneten Dialog,
  437.                so sollte ein Zeiger auf die DIAINFO-Struktur des Dialogs
  438.                übergeben werden, damit gegebenenfalls der Ausgabebereich
  439.                korrekt berechnet werden kann.
  440.             -> Bedeutung des Parameters 'select':
  441.  
  442.                    /* Status setzen (=selektieren) */
  443.                    #define SET_STATE    1
  444.  
  445.                    /* Status löschen (=deselektieren) */
  446.                    #define CLEAR_STATE  0
  447.  
  448.                    /* Status invertieren */
  449.                    #define FLIP_STATE   -1
  450.  
  451.         void ob_disable(DIAINFO *info,OBJECT *tree,int object,int disable,
  452.                        int draw)
  453.             -> Objekt 'object' im Baum 'tree' in Abhängigkeit des
  454.                Parameters 'disable' dis-/enablen und evtl. neuzeichnen
  455.                (draw!=0). Parameter und Aufruf s. Funktion ob_select()
  456.  
  457.         void ob_doflag(OBJECT *tree,int object,int masc);
  458.             -> einzelne Bits 'masc' der Objektflags des Objekts 'object'
  459.                im Baum 'tree' durch Veroderung setzen
  460.  
  461.         void ob_undoflag(OBJECT *tree,int object,int masc);
  462.             -> einzelne Bits 'masc' der Objektflags des Objekts 'object'
  463.                im Baum 'tree' durch Maskierung löschen
  464.  
  465.         int ob_isflag(OBJECT *tree,int object,int masc);
  466.             -> Bits 'masc' der Objektflags des Objekts 'object' im Baum
  467.                'tree' testen
  468.             -> Rückgabewert:
  469.                TRUE (1):  alle Bits gesetzt
  470.                FALSE (0): Bits (teilweise) nicht gesetzt
  471.  
  472.         void ob_setflags(OBJECT *tree,int object,int flags);
  473.             -> Objektflags des Objekts 'object' im Baum 'tree' auf den
  474.                Wert 'flags' setzen
  475.  
  476.         void ob_xywh(OBJECT *tree,int object,GRECT *rect);
  477.             -> Ausmaße und Koordinaten (relativ zur linken oberen Ecke
  478.                des übergeordneten Objekts) des Objekts 'object' im Baum
  479.                'tree' ermitteln und in der GRECT-Struktur 'rect' sichern
  480.  
  481.         char *ob_get_text(OBJECT *tree,int object,int clear);
  482.             -> Zeiger auf den Text des Objekts 'object' im Baum 'tree'
  483.                ermitteln und Text löschen, sofern 'clear' ungleich Null
  484.                (Funktion beachtet erweiterte Objekttypen (Attribut-Text))
  485.             -> Rückgabewert gleich NULL, wenn es sich um kein Text-Objekt
  486.                handelt
  487.  
  488.         void ob_set_text(OBJECT *tree,int object,char *text);
  489.             -> Text des Objekts 'object' im Baum 'tree' auf 'text' setzen
  490.                (Funktion beachtet erweiterte Objekttypen (Attribut-Text))
  491.  
  492.         void ob_clear_edit(OBJECT *tree)
  493.             -> Text in allen Eingabefeldern des Baums 'tree' löschen
  494.                (Funktion nur verfügbar, wenn Library nicht als Light-
  495.                 Version übersetzt wurde)
  496.  
  497.         int ob_set_hotkey(OBJECT *tree,int object,char hotkey);
  498.             -> Hotkey des Objekts 'object' im Baum 'tree' auf den
  499.                Buchstaben 'hotkey' setzen (Hotkey-Unterstrich wird
  500.                automatisch angepaßt)
  501.             -> Rückgabewert ungleich FALSE -> Hotkey konnte gesetzt werden
  502.  
  503.         char ob_get_hotkey(OBJECT *tree,int object);
  504.             -> Hotkey des Objekts 'object' im Baum 'tree' ermitteln
  505.             -> Rückgabewert gleich Null, wenn kein Hotkey gesetzt war
  506.  
  507.         int ob_draw_chg(DIAINFO *info,int object,GRECT *area,
  508.                          int new_state,boolean top);
  509.             -> Objekt 'object' (und untergeordnete Objekte) des Dialogs
  510.                'info' darstellen und gegebenenfalls Objektstatus ändern
  511.                (new_state>=0, s. objc_change)
  512.             -> Begrenzung des Ausgabebereichs auf das Reckteck 'area' oder
  513.                auf die Ausmaße des Dialogs (area==NULL)
  514.             -> Ist der Dialog 'info' der oberste Dialog bzw. im obersten
  515.                Fenster, so kann die Ausgabe durch Setzen des Parameters
  516.                'top' auf einen Wert ungleich Null beschleunigt werden
  517.             -> Rückgabewert:
  518.                 TRUE:  Okay
  519.                 FALSE: Objekt konnte nicht ausgegeben werden
  520.                 FAIL:  Objekt-Status konnte nicht gesetzt werden
  521.  
  522.         int ob_draw(DIAINFO *info,int object)
  523.             -> Objekt 'object' (und untergeordnete Objekte) des Dialogs
  524.                'info' darstellen (verkürzter Aufruf von
  525.                ob_draw_chg(info,object,NULL,FAIL,FALSE))
  526.  
  527.         int ob_draw_list(DIAINFO *info,int *objects,GRECT *area);
  528.             -> Liste von Objekten 'objects' (und untergeordnete Objekte)
  529.                des Dialogs 'info' darstellen (Abbruch der Liste mit
  530.                negativem Wert oder Null)
  531.             -> Begrenzung des Ausgabebereichs auf das Reckteck 'area' oder
  532.                auf die Ausmaße des Dialogs (area==NULL)
  533.             -> Diese Funktion ist schneller als die einzelne Ausgabe
  534.                von mehreren Objekten über ob_draw_chg()
  535.             -> Rückgabewert:
  536.                 TRUE:  Okay
  537.                 FALSE: Objekte konnten nicht ausgegeben werden
  538.  
  539.         void ob_draw_dialog(OBJECT *tree,int x,int y,int w,int h);
  540.             -> Dialog 'tree' zentrieren, Bildschirmbereich reservieren,
  541.                eine sich öffnende Box von der Dialogmitte zu den
  542.                Koordinaten (x,y,w,h) zeichnen (sofern Parameter x,y,w,h
  543.                größer als Null sind) und Dialog darstellen
  544.  
  545.         void ob_undraw_dialog(OBJECT *tree,int x,int y,int w,int h);
  546.             -> Eine sich schließende Box von den Koordinaten (x,y,w,h) zur
  547.                Dialogmitte zeichnen (sofern Parameter x,y,w,h größer als
  548.                Null sind) und Bildschirmbereich freigeben
  549.  
  550.         int ob_radio(OBJECT *tree,int parent,int object)
  551.             -> Radio-Buttons innerhalb des übergeordneten Objekts 'parent'
  552.                im Baum 'tree' auf neues Objekt 'object' (Index des
  553.                Radio-Buttons, nicht Objekt-Nummer!) setzen bzw.
  554.                aktuell gesetztes Objekt ermitteln (object<0)
  555.             -> Rückgabewert: Gesetztes Objekt
  556.  
  557.         int ob_get_parent(OBJECT *tree,int object);
  558.             -> Elternobjekt des Objekts 'object' im Baum 'tree' ermitteln
  559.  
  560.     4. Erweiterte Rechteck-Routinen (u.a. kompatibel zum PC-GEM 2.0)
  561.        -------------------------------------------------------------
  562.  
  563.         void rc_grect_to_array(GRECT *rect,int *array);
  564.             -> Reckteck 'rect' in Koordinaten-Feld 'array' wandeln
  565.  
  566.         void rc_array_to_grect(int *array,GRECT *rect);
  567.             -> Koordianten-Feld 'array' in Rechteck 'rect' wandeln
  568.  
  569.         int rc_copy(GRECT *src,GRECT *dst);
  570.             -> Rechteck 'src' nach Rechteck 'dst' kopieren
  571.             -> Rückgabewert ist immer Null
  572.  
  573.         int rc_equal(GRECT *rect1,GRECT *rect1);
  574.             -> Testet die Rechtecke 'rect1' und 'rect2' auf Gleichheit
  575.                (Rückgabewert ungleich Null)
  576.  
  577.         int rc_intersect(GRECT *src,GRECT *dst);
  578.             -> schneidet das Rechteck 'src' mit dem Rechteck 'dst'
  579.                und gibt den gemeinsamen Bereich in 'dst' zurück
  580.             -> Rückgabewert gleich Null, sofern die Rechtecke keinen
  581.                gemeinsamen Bereich besitzen
  582.  
  583.         int rc_inside(int x,int y,GRECT *rect);
  584.             -> Testet, ob die Koordinaten (x,y) im Rechteck 'rect'
  585.                liegen (Rückgabewert ungleich Null)
  586.  
  587.         WICHTIG:
  588.         Alle rc_sc_()-Funktionen schalten weder die Maus an/aus noch
  589.         setzen sie den wind_update()-Status!
  590.  
  591.         RC_RECT-Struktur:
  592.         -----------------
  593.  
  594.         typedef struct
  595.         {
  596.             /* Rechteck-Struktur gültig? (valid!=0) */
  597.             int valid;
  598.  
  599.             /* Koordinaten des ursprünglichen Bildschirmrechtecks */
  600.             GRECT   area;
  601.  
  602.             /* alle weiteren Variablen dieser Struktur sind nur für INTERNE
  603.                Zwecke */
  604.         } RC_RECT;
  605.  
  606.         int rc_sc_save(GRECT *area,RC_RECT *rc)
  607.             -> Bildschirmbereich 'area' in Rechteck-Struktur 'rc' sichern
  608.             -> Rückgabewert: (entsprechend rc->valid)
  609.                 TRUE:  Bereich konnte gesichert werden
  610.                 FALSE: Nicht genügend Speicher oder Bereich teilweise
  611.                        außerhalb des Bildschirms
  612.  
  613.         int rc_sc_freshen(int sx,int sy,RC_RECT *rc)
  614.             -> Rechteck-Struktur 'rc' erneuern, d.h. Bildschirmbereich
  615.                an den Koordinaten (sx,sy) in Puffer kopieren
  616.             -> Rückgabewert:
  617.                 TRUE:  Bereich konnte gesichert werden
  618.                 FALSE: Rechteck-Struktur nicht gültig oder Bereich
  619.                        teilweise außerhalb des Bildschirms
  620.  
  621.         int rc_sc_restore(int dx,int dy,RC_RECT *rc,int mode)
  622.             -> Rechteck-Struktur 'rc' freigeben und/oder an Position
  623.                (dx,dy) zurückkopieren
  624.             -> Parameter 'mode':
  625.                 TRUE:  Bereich zurückkopieren und Speicher freigeben
  626.                 FALSE: Bereich nur zurückkopieren
  627.                 FAIL:  Nur Speicher freigeben
  628.             -> Rückgabewert:
  629.                 TRUE:  Alles in Ordnung
  630.                 FALSE: Rechteck-Struktur ungültig
  631.  
  632.         void rc_sc_copy(GRECT *src,int x,int y,int mode);
  633.             -> Kopiert den Bildschirmbereich 'src' zu den Koordinaten
  634.                (x,y) (Kopiermodus 'mode' s. vro_cpyfm)
  635.  
  636.         void rc_sc_clear(GRECT *rect);
  637.             -> Löscht den Bildschirmbereich 'rect'
  638.  
  639.         void rc_sc_invert(GRECT *rect);
  640.             -> Invertiert den Bildschirmbereich 'rect'
  641.  
  642.         int rc_sc_scroll(GRECT *in_out,int dist_x,int dist_y,GRECT *out2)
  643.             -> Rechteck 'in_out' um Distanz (dist_x,dist_y) verschieben
  644.                und neuzuzeichnende Rechtecke in 'in_out' und 'out2'
  645.                zurückgeben. Dabei wird automatisch der Bereich auf den
  646.                Bildschirm beschränkt. (diese Funktion ist die Grundlage
  647.                der Funktion scroll_window())
  648.             -> Rückgabewerte:
  649.                0 - kein Redraw nötig
  650.                1 - Rechteck 'in_out' muß neugezeichnet werden
  651.                2 - Rechteche 'in_out' und 'out2' müssen neugezeichnet
  652.                    werden (nur bei diagonalem Scrolling)
  653.  
  654.     5. VDI-Attribut- und Clipping-Funktionen
  655.        -------------------------------------
  656.  
  657.         Hinweis:
  658.         --------
  659.         Das Clipping der internen Workstation ist normalerweise auf das
  660.         Desktopfenster oder während eines Redraws auf Bereiche der
  661.         Rechteckliste eines Fensters gesetzt. Grundsätzlich ist der
  662.         Ausgabebereich aber INNERHALB des Bildschirms!
  663.  
  664.         void vsf_aespattern(int handle, int x, int y, int pattern)
  665.             -> an die Koordinaten (x,y) angepaßtes AES-Füllmuster
  666.                'pattern' (0-7) berechnen und als neues Füllmuster der
  667.                Workstation 'handle' setzen
  668.  
  669.         void vs_attr(void);
  670.             -> wurden die Attribute der internen VDI-Workstation x_handle
  671.                nicht über Library-Funktionen verändert, so muß diese
  672.                Funktion sofort danach aufgerufen werden, um dies der Library
  673.                kenntlich zu machen
  674.  
  675.         void v_set_text(int font,int height,int color,int out[4])
  676.             -> VDI-Text-Attribute der internen Workstation x_handle setzen:
  677.                font:    Font-ID
  678.                height:  Höhe in Pixel (>0) oder in Punkt (<0)
  679.                color:   Text-Farbe
  680.                out:     Array für Rückgabewerte von vst_height/vst_point
  681.                         oder NULL
  682.  
  683.         void v_set_mode(int mode);
  684.             -> Grafikmodus der internen Workstation x_handle auf
  685.                den Wert 'mode' (0-3) setzen
  686.  
  687.         void v_set_line(int color,int width);
  688.             -> VDI-Linien-Attribute der internen Workstation
  689.                x_handle setzen: (neg. Wert -> keine Veränderung)
  690.                color: Linien-Farbe
  691.                width: Linien-Dicke
  692.  
  693.         void v_set_fill(int color,int interior,int style);
  694.             -> VDI-Füllmuster-Attribute der internen Workstation
  695.                x_handle setzen: (neg. Wert -> keine Veränderung)
  696.                color:        Füllmuster-Farbe
  697.                vsf_interior: Füllmuster-Typ (0-4)
  698.                vsf_style:    Füllmuster-Stil
  699.  
  700.         void v_aespattern(int x,int y,int pattern);
  701.             -> an die Koordinaten (x,y) angepaßtes AES-Füllmuster
  702.                'pattern' (0-7) berechnen und als neues Füllmuster der
  703.                internen Workstation x_handle setzen
  704.  
  705.         void save_clipping(int *array);
  706.             -> aktuellen Clipping-Bereich im Koordinaten-Feld 'array'
  707.                sichern
  708.  
  709.         void restore_clipping(int *array);
  710.             -> Clipping-Bereich auf Koordinaten-Feld 'array' setzen
  711.  
  712.         HINWEIS:
  713.         Wird die interne VDI-Workstation benutzt, so muß sichergestellt
  714.         sein, daß entweder Library-Funktionen benutzt oder die Attribute
  715.         in ihren ursprünglichen Zustand zurückgesetzt werden.
  716.         Ist dies nicht der Fall, muß sofort nach Veränderung der Attribute
  717.         die Funktion vs_attr() aufgerufen werden. Allerdings darf auf keinen
  718.         Fall der Clipping-Bereich verändert werden, d.h. er ist mit
  719.         save_clipping()/restore_clipping wiederherzustellen.
  720.  
  721.     6. Erweiterte Scrap-Directory-Routinen
  722.        -----------------------------------
  723.  
  724.         int scrp_path(char *path,char *file)
  725.             -> vollständigen Zugriffspfad der Clipboard-Datei 'file'
  726.                (sofern file!=NULL) ermitteln. Wird für den Parameter 'file'
  727.                NULL übergeben, so wird nur der Clipboard-Pfad ermittelt.
  728.             -> Rückgabewert:
  729.                TRUE:  Alles in Ordnung
  730.                FALSE: Kein Clipboard-Pfad gesetzt
  731.  
  732.         void scrp_clear(int all);
  733.             -> Alle Dateien (all!=0) oder nur die 'SCRAP.*'-Dateien
  734.                im Scrap-Directory löschen
  735.  
  736.         long scrp_length(void);
  737.             -> Berechnung der Länge des Inhalts des Scrap-Directories
  738.  
  739.         int scrp_find(char *extensions,char *filename);
  740.             -> Scrap-Directory (Clipboard) nach Scrap-Datei mit einer
  741.                der durch Komma, Punkt oder Leerzeichen getrennten
  742.                Erweiterungen 'extensions' durchsuchen, z.B.
  743.                scrp_find("img.txt.asc.ps",scrap). Dabei wird die Liste
  744.                von links nach rechts abgearbeitet.
  745.             -> String 'filename' enthält im Erfolgsfall (Rückgabewert
  746.                ungleich Null) den kompletten Pfad der gefundenen Datei
  747.  
  748.         void scrp_changed(int format,long best_ext);
  749.             -> Clipboard-Inhalt wurde verändert (SC_CHANGED-Nachricht
  750.                wird (per XAccBroadCast) an alle Applikationen sowie
  751.                AV_PATH_UPDATE an den AV-Server gesendet), wobei nach
  752.                dem Löschen des Clipboards scrp_changed(SCF_INDEF,0l)
  753.                aufgerufen werden sollte.
  754.             -> format: Bitmap des Dateiformats
  755.  
  756.             #define SCF_INDEF   0x0000  /* undefiniert */
  757.             #define SCF_DBASE   0x0001  /* Datenbank */
  758.             #define SCF_TEXT    0x0002  /* Text */
  759.             #define SCF_VECTOR  0x0004  /* Vektor-Grafik */
  760.             #define SCF_RASTER  0x0008  /* Raster-Grafik */
  761.             #define SCF_SHEET   0x0010  /* Tabellen-Kalkulation */
  762.             #define SCF_SOUND   0x0020  /* Sound */
  763.  
  764.             -> best_ext: 4 Zeichen (z.B. ".RTF") für die "beste" der
  765.                          abgespeicherten Dateien
  766.  
  767.     7. Erweiterte Grafik-Routinen
  768.        --------------------------
  769.  
  770.         void graf_busy_mouse(void);
  771.             -> Maus als rotierende Scheibe darstellen
  772.  
  773.         void graf_set_slider(SLINFO *slider,OBJECT *tree,int mode);
  774.             -> Elemente des Sliders 'slider' im Baum 'tree'
  775.                anhand der Werte der SLINFO-Struktur initialisieren und
  776.                gegebenenfalls neuzeichnen
  777.             -> mode: Bitmap der Initialisierung
  778.  
  779.             #define GRAF_SET_ARROWS     1
  780.                 -> Slider-Pfeile setzen
  781.             #define GRAF_SET_SIZE_POS   2
  782.                 -> Größe/Position des Schiebers berechnen und setzen
  783.             #define GRAF_SET            3
  784.                 -> wie GRAF_SET_ARROWS und GRAF_SET_SIZE_POS
  785.             #define GRAF_DRAW_SLIDER    4
  786.                 -> Slider-Elemente zeichnen
  787.             #define GRAF_DRAW           7
  788.                 -> wie GRAF_SET und GRAF_DRAW_SLIDER
  789.  
  790.         void graf_arrows(SLINFO *slider,OBJECT *tree,int draw);
  791.             -> Pfeile des Sliders 'slider' im Baum 'tree' initialisieren
  792.                und gegebenenfalls neuzeichnen (draw!=0)
  793.  
  794.         void graf_rt_slidebox(SLINFO *slider,int object,int double_click);
  795.             -> Echtzeitslider auswerten und darstellen (diese Routine wird
  796.                intern automatisch aufgerufen, wenn die SLINFO-Strukturen
  797.                bei open_dialog() übergeben wurden)
  798.             -> Parameter:
  799.                 slider: Zeiger auf SLINFO-Struktur des Sliders
  800.  
  801.                 #define HOR_SLIDER      0   /* horizontaler Slider */
  802.                 #define VERT_SLIDER     1   /* vertikaler Slider */
  803.  
  804.                 #define SL_STEP         0   /* Einzelschritt */
  805.                 #define SL_LINEAR       1   /* linear */
  806.                 #define SL_LOG          2   /* logarithmisch */
  807.                 #define SL_EXP          3   /* exponential */
  808.  
  809.                 typedef struct
  810.                 {
  811.                     /* Scan-Code des Ereignisses (Highbyte: Scan-Code,
  812.                        Low-Byte: ASCII-Code oder Null) */
  813.                     int     scan;
  814.  
  815.                     /* Sondertastenstatus */
  816.                     int     state;
  817.  
  818.                     /* Slider-Kommando (s. Beschreibung des
  819.                        Parameters 'object')
  820.                     int     cmd;
  821.                 } SLKEY;
  822.  
  823.                 typedef struct
  824.                 {
  825.                     /* Zeiger auf DIAINFO-Struktur des Dialogs */
  826.                     DIAINFO *sl_info;
  827.  
  828.                     /* Nummer des Elternobjekts */
  829.                     int     sl_parent;
  830.  
  831.                     /* Objektnummer des Schiebers */
  832.                     int     sl_slider;
  833.  
  834.                     /* Objektnummern der Pfeile oder negative Werte */
  835.                     int     sl_dec,sl_inc;
  836.  
  837.                     /* Position, Seitenlänge und Maximalwert des Schiebers */
  838.                     int     sl_pos,sl_page,sl_max;
  839.  
  840.                     /* Richtung des Sliders: */
  841.                     char    sl_vh;      /* HOR_SLIDER,VERT_SLIDER  */
  842.  
  843.                     /* Wiederholungs-Modus der Pfeile */
  844.                     char    sl_mode;    /* SL_STEP,SL_LINEAR,SL_LOG,SL_EXP */
  845.  
  846.                     /* Verzögerungsdauer in Milisekunden vor und während der
  847.                        Wiederholung */
  848.                     int     sl_delay,sl_speed;
  849.  
  850.                     /* Zeiger auf Routine (oder NULL), welche nach jeder
  851.                        Veränderung des Sliderwerts 'sl_pos' aufgerufen wird */
  852.                     void    (*sl_do)(OBJECT *obj,int pos,int prev,
  853.                                      int max_pos,int top);
  854.                     /* obj:     Zeiger auf das Slider-Objekt
  855.                        pos:     aktuelle Position des Schiebers
  856.                        prev:    vorherige Position des Schiebers
  857.                        max_pos: maximale Position des Schiebers
  858.                        top:     Dialog ist im Vordergrund */
  859.  
  860.                     /* Zeiger auf Feld mit Slider-Hotkeys oder NULL (wird
  861.                        nur ausgewertet, wenn die SLINFO-Struktur bei
  862.                        open_dialog() übergeben wurde) */
  863.                     SLKEY   *sl_keys;
  864.  
  865.                     /* Anzahl der Hotkeys im Feld 'sl_keys' */
  866.                     int     sl_keys_cnt;
  867.                 } SLINFO;
  868.  
  869.                object: angeklicktes Objekt oder eines der folgenden
  870.                        Kommandos:
  871.  
  872.                         #define SL_UP       -1  /* Zeile hoch */
  873.                         #define SL_DOWN     -2  /* Zeile runter */
  874.                         #define SL_PG_UP    -3  /* Seite hoch */
  875.                         #define SL_PG_DN    -4  /* Seite runter */
  876.                         #define SL_START    -5  /* Slider-Anfang */
  877.                         #define SL_END      -6  /* Slider-Ende */
  878.  
  879.                double_click: Objekt wurde per Doppelklick angeklickt
  880.  
  881.         int graf_rt_rubberbox(int s_x,int s_y,GRECT *rect,int *w,int *h,
  882.                               void(*box_do)(int *array));
  883.             -> Echtzeitgummiband innerhalb des Rechtecks 'rect' mit den
  884.                Start-Koordinaten (s_x,s_y) auswerten und darstellen
  885.             -> Im Erfolgsfall (Rückgabewert!=0) enthalten die Variablen
  886.                '*w' und '*h' die Breite und Höhe des Rechtecks
  887.             -> 'box_do' enthält einen Zeiger auf eine Funktion (oder NULL),
  888.                welche nach jeder Veränderung des Rechtecks mit einem
  889.                Zeiger auf das Koordinaten-Array 'array' des Rechtecks
  890.                aufgerufen wird
  891.  
  892.     8. Menü-Funktionen
  893.        ---------------
  894.  
  895.         WICHTIG:
  896.         --------
  897.         Alle Menü-Funktionen, bei denen kein Zeiger auf den Objektbaum
  898.         übergeben wird, funktionieren nur, wenn vorher eine Menü-Leiste
  899.         per menu_install() angemeldet wurde! Ansonsten müssen die
  900.         entsprechenden AES-Funktionen benutzt oder die Objekt-Attribute
  901.         direkt manipuliert werden.
  902.         Unter MultiTasking wird beachtet, welcher Applikation die Menü-
  903.         leiste gehört, um unnötige Prozeßumschaltungen zu verhindern.
  904.  
  905.         int menu_install(OBJECT *menu,int show);
  906.             -> Menü-Leiste 'menu' darstellen (show!=0) oder löschen
  907.                (show==0). Diese Funktion berücksichtigt, ob gegebenenfalls
  908.                auch ein Accessory eine Menü-Leiste besitzen darf und ini-
  909.                tialisiert die Menü-Punkte 'Fenster wechseln' und 'Fenster
  910.                schließen'
  911.             -> Rückgabewert wie bei 'menu_bar'
  912.  
  913.         void menu_enable(boolean enable);
  914.             -> Menü-Leiste aktivieren (enable==TRUE) bzw. deaktivieren
  915.                (enable==FALSE) und neuzeichnen.
  916.  
  917.         void menu_item_enable(int object,int enable)
  918.             -> Menü-Eintrag 'object' aktivieren (enable!=0) oder
  919.                deaktivieren (enable==0)
  920.  
  921.         void menu_select(int title,int select)
  922.             -> Menü-Titel 'title' normal (select==0) oder invers
  923.                (select!=0) darstellen
  924.  
  925.         boolean menu_dropped();
  926.             -> Testen, ob ein Drop-Down-Menü der Menüleiste heruntergeklappt
  927.                ist
  928.  
  929.     9. Dialog-Optionen und -optik setzen
  930.        ---------------------------------
  931.  
  932.         void dial_colors(int dialog_pattern,int dialog_color,
  933.                          int cycle_button,int hotkey,int check_box,
  934.                          int radio_button,int arrow,int alert)
  935.             -> Dialog-Optik setzen:
  936.                dialog_pattern: Hintergrundmuster des Dialogs (0-7)
  937.                dialog_color:   Hintergrundfarbe des Dialogs (0-15)
  938.                cycle_button:   Cycle-Button-Farbe (0-15)
  939.                check_box:      Checkbox-Farbe (0-15)
  940.                radio_button:   Radio-Button-Farbe (0-15)
  941.                arrow:          Slider-Arrow-Farbe (0-15)
  942.                alert:          Farbe des Alert-Icons (0-15)
  943.  
  944.         void dial_options(boolean round,boolean title_frame,
  945.                           boolean title_small,boolean niceline,
  946.                           boolean return_default,boolean background,
  947.                           boolean nonselectable,boolean always_keys,
  948.                           boolean toMouse);
  949.             -> verschiedene Optionen setzen:
  950.                round:          Dialogpositionen und Fensterpositionen
  951.                                auf Bytegrenzen (aus Geschwindigkeits-
  952.                                gründen) runden
  953.                title_frame:    Überschriften umrahmen
  954.                title_small:    Kleine Schrift (SMALL) für Überschriften
  955.                niceline:       Niceline für Trennstriche in Menüs/Popups
  956.                return_default: TRUE:  Return selektiert Default-Objekt
  957.                                FALSE: Return springt zum nächsten Eingabefeld
  958.                                FAIL:  Return selektiert Default-Objekt beim
  959.                                letzten Eingabefeld (ansonsten wie FALSE)
  960.                background:     Fensterdialoge (sowie mit open_window() ge-
  961.                                öffnete Fenster) können im Hintergrund
  962.                                wie normale Dialoge bedient werden
  963.                nonselectable:  Fliegende Dialoge fliegen auch beim Anklicken
  964.                                von nicht-selektierbaren/editierbaren
  965.                                Objekten
  966.                always_keys:    Tastendrücke werden auch bei fliegenden
  967.                                oder modalen Dialogen an die Anwendung
  968.                                weitergegeben
  969.                toMouse:        Tastendrücke an Fensterdialog unter Maus-
  970.                                zeiger senden, sofern oberster Dialog
  971.                                weder modal noch fliegend ist
  972.                                -> zusammen mit 'background' ist somit eine
  973.                                   vollständige Bedienung von Hintergrund-
  974.                                   dialogen möglich
  975.  
  976.         void title_options(boolean mode,int color,int size);
  977.             -> Unterstrichenen Text einstellen:
  978.                mode:  Strich wird über die ganze Breite des Dialogs (TRUE)
  979.                       oder über die im Resource vorgebenen Koordinaten
  980.                       (FALSE) gezeichnet
  981.                color: Strichfarbe (0-15)
  982.                size:  Strickdicke in Pixel oder Null, wenn der Wert aus
  983.                       der Resource-Struktur entnommen werden soll
  984.  
  985.         BUTTON-Struktur:
  986.         ----------------
  987.             typedef struct
  988.             {
  989.                 /* Zeiger auf monochrome 16x16-Bitmap (32 Bytes) des
  990.                    selektierten und des normalen Buttons im geräte-
  991.                    abhängigen Format */
  992.                 int *but_on,*but_off;
  993.             } BUTTON;
  994.  
  995.         void radio_image(int index,BUTTON *radiobutton);
  996.             -> vordefinierte Images (index: 0-7) oder benutzerdefinierten
  997.                Button 'radiobutton' (radiobutton!=NULL) für Radio-Buttons
  998.                auswählen
  999.  
  1000.         void check_image(int index,BUTTON *checkbox);
  1001.             -> vordefinierte Images (index: 0-5) oder benutzerdefinierten
  1002.                Button 'checkbox' (checkbox!=NULL) für Check-Box auswählen
  1003.  
  1004.         void cycle_image(int index,BUTTON *cyclebutton);
  1005.             -> vordefinierte Images (index: 0-1) oder benutzerdefinierten
  1006.                Button 'cyclebutton' (cyclebutton!=NULL) für Cycle-Buttons
  1007.                auswählen
  1008.  
  1009.         void arrow_image(int index,BUTTON *down,BUTTON *up,BUTTON *left,
  1010.                          BUTTON *right);
  1011.             -> vordefinierte Images (index: 0-2) oder benutzerdefinierte
  1012.                Buttons 'down', 'up' 'left', 'right' (sofern ungleich NULL)
  1013.                für Slider-Pfeile auswählen
  1014.  
  1015.     10. Bibliothek (AES,VDI) sowie Resource (de-) initialisieren
  1016.         --------------------------------------------------------
  1017.  
  1018.         boolean open_work(int *handle,int *work_out);
  1019.             -> virtuelle Bildschirm-Workstation öffnen
  1020.             -> Rückgabewert ungleich FALSE, wenn Workstation geöffnet
  1021.                werden konnte
  1022.             -> handle:   VDI-Handle im Erfolgsfall
  1023.                work_out: work_out[57]-Feld
  1024.  
  1025.         void close_work(int handle);
  1026.             -> virtuelle Bildschirm-Workstation 'handle' schließen
  1027.  
  1028.         boolean init_gem(char *m_entry,char *x_name,char *a_name,
  1029.                          int av_msgs,int va_msgs,int xacc_msgs)
  1030.             -> Initialisierung der Library
  1031.                 - Anmeldung beim AES (appl_init)
  1032.                 - Xacc-2/AV-Protokolle initialisieren
  1033.                 - interne VDI-Workstation öffnen
  1034.                 - Scrap-Directory initialisieren
  1035.                 - globale Variablen sowie interne Strukturen initialisieren
  1036.             -> Parameter:
  1037.                 m_entry:   Eintrag im Accessory-Menü (als Accessory oder
  1038.                            unter MTOS) oder NULL
  1039.                 x_name:    (erweiterter) XAcc-2-Programmname
  1040.                 a_name:    AV-Programmname (8 Zeichen wie bei appl_find)
  1041.  
  1042.                 av_msgs:   Bitmap der unterstützten Nachrichten der
  1043.                            Nachricht AV_PROTOKOLL (VA_START wird von der
  1044.                            Library immer angegeben und ausgewertet!)
  1045.  
  1046.                 #define MSG_SETSTATUS   0x001 /* VA_SETSTATUS */
  1047.                 #define MSG_START       0x002 /* VA_START */
  1048.  
  1049.                 va_msgs:   Bitmap der unterstützten Nachrichten der
  1050.                            Nachricht VA_PROTOSTATUS (AV_SENDKEY, AV_EXIT,
  1051.                            AV_ACCWINDOPEN/AV_ACCWINDCLOSED sowie
  1052.                            AV_PATH_UPDATE werden von der Library immer an-
  1053.                            gegeben und ausgewertet!)
  1054.  
  1055.                 #define MSG_SENDKEY     0x001 /* AV_SENDKEY */
  1056.                 #define MSG_ASKFILEFONT 0x002 /* AV_ASKFILEFONT */
  1057.                 #define MSG_ASKCONFONT  0x004 /* AV_ASKCONFONT,
  1058.                                                  AV_OPENCONSOLE */
  1059.                 #define MSG_ASKOBJECT   0x008 /* AV_ASKOBJECT */
  1060.                 #define MSG_OPENWIND    0x010 /* AV_OPENWIND */
  1061.                 #define MSG_STARTPROG   0x020 /* AV_STARTPROG */
  1062.                 #define MSG_ACCWINDOPEN 0x040 /* AV_ACCWINDOPEN,
  1063.                                                  AV_ACCWINDCLOSED */
  1064.                 #define MSG_STATUS      0x080 /* AV_STATUS, AV_GETSTATUS */
  1065.                 #define MSG_COPY_DRAGGED 0x100 /* AV_COPY_DRAGGED */
  1066.                 #define MSG_PATH_UPDATE 0x200 /* AV_PATH_UPDATE,
  1067.                                                  AV_WHAT_IZIT,
  1068.                                                  AV_DRAG_ON_WINDOW */
  1069.                 #define MSG_EXIT        0x400 /* AV_EXIT */
  1070.  
  1071.                 xacc_msgs: Bitmap der unterstützten ACC-Nachrichten (alle
  1072.                            anderen ACC-Nachrichten werden automatisch
  1073.                            ausgewertet)
  1074.  
  1075.                 #define X_MSG_TEXT      0x001 /* ACC_TEXT */
  1076.                 #define X_MSG_META      0x002 /* ACC_META */
  1077.                 #define X_MSG_IMG       0x004 /* ACC_IMG */
  1078.  
  1079.             -> Rückgabewert:
  1080.                 TRUE:  Ok
  1081.                 FALSE: Anmeldung beim AES oder Öffnen der Workstation
  1082.                        schlug fehl
  1083.  
  1084.         void exit_gem(int status);
  1085.             -> Deinitialisierung der Library:
  1086.                 - Dialoge und Fenster schließen
  1087.                 - Menüleiste abmelden
  1088.                 - Beenden der XAcc-2-/AV-Protokolle
  1089.                 - geladene GDOS-Fonts wieder entfernen
  1090.                 - interne VDI-Workstation schließen
  1091.                 - Abmeldung beim AES (appl_exit), sofern Anwendung als
  1092.                   Programm gestartet wurde (ansonsten Endlos-Timer)
  1093.                 - Programm beenden und Wert 'status' zurückgeben
  1094.  
  1095.         boolean open_rsc((char *rscname,char *m_entry,char *x_name,char *a_name,int av_msgs,int va_msgs,int xacc_msgs)
  1096.             -> Initialisierung der Library (s. init_gem()) sowie Resource
  1097.                'rscname' laden
  1098.             -> Parameter: s. init_gem()
  1099.             -> Rückgabewert:
  1100.                 TRUE:  Ok
  1101.                 FALSE: Anmeldung beim AES oder Öffnen der Workstation
  1102.                 FAIL:  Resource-File konnte nicht geladen werden (Speicher-
  1103.                        mangel oder falscher Pfad)
  1104.  
  1105.         void close_rsc(int status);
  1106.             -> Resource-Speicher freigeben und Library deinitialisieren
  1107.                (s. exit_gem())
  1108.  
  1109.     11. Resource- und Objekt-Initialisierung
  1110.         ------------------------------------
  1111.  
  1112.             void fix_objects(OBJECT *tree,int scaling,
  1113.                              int orig_cw,int orig_ch);
  1114.                 -> erweiterte Objekte des Baums 'tree' initialisieren sowie
  1115.                    gegebenenfalls Images/Icons skalieren (scale_image)
  1116.                    und ins Geräteformat konvertieren (trans_image)
  1117.  
  1118.                 -> Parameter:
  1119.                    orig_cw: Breite des Entwurfsfonts in Pixel (meistens 8)
  1120.                             oder negativer Wert für rsrc_obfix()-kompatible
  1121.                             Anpassung
  1122.                    orig_ch: Höhe des Entwurfsfonts in Pixel (meistens 8 oder
  1123.                             16) oder negativer Wert für rsrc_obfix()-kompa-
  1124.                             tible Anpassung
  1125.                    scaling: Bitmap des Skalierungs-Modus
  1126.  
  1127.                     #define NO_SCALING      0   /* keine Skalierung */
  1128.                     #define SCALING         1   /* Skalierung */
  1129.                     #define TEST_SCALING    2   /* Testen, ob Skalierung not-
  1130.                                                    wendig ist */
  1131.                     #define DARK_SCALING    4   /* dunkle Skalierung */
  1132.  
  1133.                     Beispiele:
  1134.                     /* Nie skalieren */
  1135.                         images = NO_SCALING;
  1136.  
  1137.                     /* Immer skalieren */
  1138.                         images = SCALING;
  1139.  
  1140.                     /* Bei Bedarf (System-Font kleiner als Entwurfsfont)
  1141.                        skalieren */
  1142.                         images = SCALING|TEST_SCALING;
  1143.  
  1144.                     /* Bei Bedarf dunkel skalieren */
  1145.                         images = SCALING|TEST_SCALING|DARK_SCALING;
  1146.  
  1147.         void scale_image(OBJECT *object,int scaling,
  1148.                          int orig_cw, int orig_ch);
  1149.             -> Image/Icon 'object' skalieren
  1150.             -> Parameter s. fix_objects()
  1151.  
  1152.         void trans_image(OBJECT *object);
  1153.             -> Image/Icon 'object' in Geräteformat konvertieren
  1154.  
  1155.         void rsrc_calc(OBJECT *tree,int scaling,int orig_cw,int orig_ch);
  1156.             -> Koordinaten und Ausmaße der Objekte des Baums 'tree' an
  1157.                Ausmaße des System-Fonts unter Beachtung der Ausmaße des
  1158.                Fonts, mit welchem die Resource-Datei erstellt wurde, an-
  1159.                passen und anschließend erweiterte Objekte initialisieren
  1160.                (s. fix_objects())
  1161.             -> Parameter s. fix_objects()
  1162.  
  1163.         void rsrc_init(int n_tree,int n_obs,int n_frstr,int n_frimg,
  1164.                        int scaling,char **rs_strings,long *rs_frstr,
  1165.                        BITBLK *rs_bitblk,long *rs_frimg,
  1166.                        ICONBLK *rs_iconblk,TEDINFO *rs_tedinfo,
  1167.                        OBJECT *rs_object,OBJECT **rs_trindex,
  1168.                        RS_IMDOPE *rs_imdope,int orig_cw,int orig_ch)
  1169.             -> in Quelltext eingebundene Resource-Datei (*.RSH)
  1170.                initialisieren
  1171.  
  1172.             -> Parameter:
  1173.                n_tree:     Anzahl der Bäume (NUM_TREE)
  1174.                n_obs:      Anzahl der Objekte (NUM_OBS)
  1175.                n_frstr:    Anzahl der freien Strings (NUM_FRSTR)
  1176.                n_frimg:    Anzahl der freien Images (NUM_FRIMG)
  1177.  
  1178.                rs_strings: String-Array (Pointer zeigen auf alle
  1179.                            Zeichenketten der Resource-Datei)
  1180.                rs_frstr:   Index-Array (Indizes der freien Strings
  1181.                            für das rs_strings-Array)
  1182.                rs_bitblk:  BITBLK-Array (enthält alle Bit-Blöcke)
  1183.                rs_frimg:   Index-Array (Indizes der freien Images
  1184.                            für das rs_bitblk-Array)
  1185.                rs_iconblk: ICONBLK-Array (enthält alle icons)
  1186.                rs_tedinfo: TEDINFO-Array (enthält alle TEDINFO-Strukturen)
  1187.                rs_object:  OBJECT-Array (enthält alle Objekte)
  1188.                rs_trindex: Index-Array (Indizes der Objektbäume
  1189.                            für das rs_object-Array)
  1190.                rs_imdope:  RS_IMDOPE-Array
  1191.  
  1192.                 RS_IMDOPE-Struktur:
  1193.                 -------------------
  1194.  
  1195.                 typedef struct
  1196.                 {
  1197.                     int dummy;
  1198.                     /* Zeiger auf Bitmap (Image) */
  1199.                     int *image;
  1200.                 } RS_IMDOPE;
  1201.  
  1202.                scaling: s. fix_objects()
  1203.                orig_cw: s. fix_objects()
  1204.                orig_ch: s. fix_objects()
  1205.  
  1206.                HINWEIS:
  1207.                An allen Stellen der Resource, an denen normalerweise
  1208.                Pointer vorkommen, muß der Element-Index (Long-Wert) des
  1209.                entsprechenden Arrays stehen. Die Image-Zeiger der
  1210.                Strukturen BITBLK und ICONBLK enthalten den Index des
  1211.                zugehörigen RS_IMDOPE-Elements.
  1212.  
  1213.     12. Ereignis-Auswertung
  1214.         -------------------
  1215.  
  1216.         XEVENT-Struktur:
  1217.         ----------------
  1218.  
  1219.         typedef struct
  1220.         {
  1221.             /* PARAMETER: */
  1222.  
  1223.             /* Bitmap der gewünschten Events:
  1224.                MU_KEYBD:     Tastatur-Ereignis
  1225.                MU_MESAG:     Nachrichten-Ereignis
  1226.                MU_TIMER1-4:  Timer-Ereignis 1-4
  1227.                MU_BUTTON1/2: Button-Ereignis 1/2
  1228.                MU_M1-4:      Rechteck-Ereignis 1-4 */
  1229.             int ev_mflags;
  1230.  
  1231.             /* Parameter des 1. Button-Events MU_BUTTON1 */
  1232.             int ev_mb1clicks,ev_mb1mask,ev_mb1state
  1233.  
  1234.             /* Parameter des 1. Mouse-Event-Rechtecks MU_M1 */
  1235.             int ev_mm1flags,ev_mm1x,ev_mm1y,ev_mm1width,ev_mm1height,
  1236.  
  1237.             /* Parameter des 2. Mouse-Event-Rechtecks MU_M2 */
  1238.             int ev_mm2flags,ev_mm2x,ev_mm2y,ev_mm2width,ev_mm2height;
  1239.  
  1240.             /* Parameter des 1. Timer-Events MU_TIMER1 */
  1241.             unsigned int ev_mtlocount,ev_mthicount;
  1242.  
  1243.             /* RÜCKGABEWERTE: */
  1244.  
  1245.             /* eingetretene Ereignisse */
  1246.             int ev_mwich;
  1247.  
  1248.             /* Position des Mauszeigers sowie Zustand der Maustasten
  1249.                beim Auftreten des Events */
  1250.             int ev_mmox,ev_mmoy,ev_mmobutton;
  1251.  
  1252.             /* Zustand der Sondertasten beim Auftreten des Events */
  1253.             int ev_mmokstate;
  1254.  
  1255.             /* Scancode der gedrückten Taste (High-Byte: Scan-Code,
  1256.                Low-Byte: ASCII-Code oder Null) */
  1257.             int ev_mkreturn;
  1258.  
  1259.             /* Anzahl der Klicks mit der Maustaste (MU_BUTTON1) */
  1260.             int ev_mb1return;
  1261.  
  1262.             /* Nachrichten-Puffer */
  1263.             int ev_mmgpbuf[8];
  1264.  
  1265.             /* erweiterte PARAMETER: */
  1266.             /* Parameter des 2. Button-Events MU_BUTTON2 */
  1267.             int ev_mb2clicks,ev_mb2mask,ev_mb2state;
  1268.  
  1269.             /* Parameter des 3. Mouse-Event-Rechtecks MU_M3 */
  1270.             int ev_mm3flags,ev_mm3x,ev_mm3y,ev_mm3width,ev_mm3height;
  1271.  
  1272.             /* Parameter des 4. Mouse-Event-Rechtecks MU_M4 */
  1273.             int ev_mm4flags,ev_mm4x,ev_mm4y,ev_mm4width,ev_mm4height;
  1274.  
  1275.             /* Parameter des 2-4. Timer-Events MU_TIMER2-4 */
  1276.             long ev_mt2count,ev_mt3count,ev_mt4count;
  1277.  
  1278.             /* Zeitpunkt in Milisekunden des letzten Timer-Events
  1279.                MU_TIMER1-4 oder Null für aktuelle System-Zeit */
  1280.             long ev_mt1last,ev_mt2last,ev_mt3last,ev_mt4last;
  1281.  
  1282.             /* Anzahl der Klicks mit der Maustaste (MU_BUTTON2) */
  1283.             int ev_mb2return;
  1284.         } XEVENT;
  1285.  
  1286.         Kompatibilitäts-Makros für EVENT-Struktur und AES-Event-Routinen:
  1287.         -----------------------------------------------------------------
  1288.  
  1289.             #define ev_mbclicks     ev_mb1clicks
  1290.             #define ev_mbmask       ev_mb1mask
  1291.             #define ev_bmask        ev_mb1mask
  1292.             #define ev_mbstate      ev_mb1state
  1293.             #define ev_mbreturn     ev_mb1return
  1294.  
  1295.             #define ev_mtlocount    ev_mt1locount
  1296.             #define ev_mthicount    ev_mt1hicount
  1297.             #define ev_mtlast       ev_mt1last
  1298.  
  1299.             #define MU_TIMER1       MU_TIMER
  1300.             #define MU_BUTTON1      MU_BUTTON
  1301.  
  1302.         int Event_Multi(XEVENT *event);
  1303.             -> Auf Ereignis 'event' warten (benötigte Parameter der
  1304.                Struktur müssen initialisiert sein, sofern dies nicht
  1305.                die Initialisierungs-Routine von Event_Handler(), s.u.,
  1306.                übernimmt). Die Library wertet dabei selbständig Nachrichten
  1307.                der XAcc-2-, AV- und Drag&Drop-Protokolle aus und wandelt
  1308.                diese gegebenenfalls um. Ebenso werden Ereignisse, welche
  1309.                Fenster (-dialoge) bzw. allgemein die Library betreffen,
  1310.                ausgewertet.
  1311.  
  1312.                WICHTIG:
  1313.                Es werden nur Ereignisse zurückgeliefert, welche nicht von
  1314.                der Library oder dem durch die Funktion Event_Handler()
  1315.                definierten Handler ausgewertet wurden!
  1316.                Setzt man die Variable 'ev_mflags' auf Null oder übergibt man
  1317.                den Wert NULL für den Parameter 'event', so werden KEINE
  1318.                Events zurückgeliefert! Alle Ereignisse müssen dann vom
  1319.                Handler initialisiert und ausgewertet werden!
  1320.                Library-spezifische Nachrichten (s.u.) werden NUR an den
  1321.                Event-Handler geliefert!!!
  1322.  
  1323.             -> Rückgabewert: Bitmap der eingetretenen Ereignisse
  1324.  
  1325.         void Event_Timer(int locount,int hicount)
  1326.             -> Wartet bis die durch lo_count und hi_count in Millisekunden
  1327.                vorgebene Zeit verstrichen ist. Dabei werden allerdings
  1328.                noch Nachrichten durch die Library (der Nachrichtenpuffer
  1329.                wird komplett geleert) sowie Ereignisse durch den Handler
  1330.                ausgewertet, so daß diese Funktion z.B. während eines
  1331.                rechenintensiven Vorgangs dazu benutzt werden kann,
  1332.                Ereignisse durch einen Aufruf mit kurzer Wartezeit auszu-
  1333.                werten (z.B. Fenster verschieben, neuzeichnen etc...)
  1334.  
  1335.         void Event_Handler(int (*init)(XEVENT *,int,int),
  1336.                            int (*handler)(XEVENT *));
  1337.             -> Routinen zur Ereignisauswertung festlegen, wobei diese Rou-
  1338.                tinen diejenigen Ereignisse auswerten, welche nicht auto-
  1339.                matisch von der Library bearbeitet wurden. Durch Übergabe
  1340.                von NULL können bereits angemeldete Funktionen einzeln wieder
  1341.                abgemeldet werden. Ebenso kann man die Routinen beliebig
  1342.                oft neu setzen, z.B. für eine lokale Ereignisauswertung.
  1343.  
  1344.             -> Parameter:
  1345.                 int (*init)(XEVENT *event,int available):
  1346.                     -> Routine, welche u.a. von X_Form_Do bei jeder
  1347.                        Initialisierung eines Dialogs aufgerufen wird. Die
  1348.                        Routine gibt eine Bitmap der gewünschten Events zu-
  1349.                        rück und initialisiert gegebenenfalls Variablen der
  1350.                        übergebenen XEVENT-Struktur 'event'.
  1351.                        Angefordert werden können nur die Events, welche in
  1352.                        der Bitmap 'available' gesetzt sind.
  1353.  
  1354.                 int (*handler)(XEVENT *event):
  1355.                     -> Routine, welche u.a. von X_Form_Do aufgerufen wird
  1356.                        und die Ereignisse, welche von der Library nicht ver-
  1357.                        arbeitet wurden, auswertet. Zurückgegeben wird eine
  1358.                        Bitmap der ausgewerteten Ereignisse. V.a. bei Tasta-
  1359.                        tur-Ereignissen, welche nicht ausgewertet wurden,
  1360.                        sollte MU_KEYBD nicht gesetzt sein, damit die Library
  1361.                        gegebenenfalls den Tastendruck per Xacc-2- oder AV-
  1362.                        -Protokoll weiterleiten kann. Dies kann man natürlich
  1363.                        unterbinden, indem man ständig alle Ereignisse zu-
  1364.                        rückgibt.
  1365.  
  1366.                        WICHTIG:
  1367.                        Diese Routine darf keine Variablen der XEVENT-Struk-
  1368.                        tur (abgesehen von den Ausgabewerten) verändern!
  1369.  
  1370.                 Library-spezifische Nachrichten (MU_MESAG):
  1371.                 -------------------------------------------
  1372.  
  1373.                     -> Eingabefeld wurde verändert:
  1374.                         msg[0]        = OBJC_EDITED
  1375.                         msg[3]        = Nummer des aktuellen Eingabeobjekts
  1376.                                         oder negativer Wert, falls alle
  1377.                                         Eingabefelder betroffen sind
  1378.                         msg[4]/msg[5] = Zeiger auf die DIAINFO-Struktur des
  1379.                                         Dialogs
  1380.  
  1381.                     -> Status eines Objekts (kein EXIT-/TOUCHEXIT-Objekt,
  1382.                        bei Slidern nach Positionsänderung das Schieber-
  1383.                        Objekt) hat sich geändert:
  1384.                         msg[0]        = OBJC_CHANGED
  1385.                         msg[3]        = Nummer des Objekts
  1386.                         msg[4]/msg[5] = Zeiger auf die DIAINFO-Struktur des
  1387.                                         Dialogs
  1388.  
  1389.                     -> Größe oder Position des Dialogs hat sich geändert,
  1390.                        wobei die Ausmaße des Wurzelobjekts bereits angepaßt
  1391.                        wurden
  1392.                         msg[0]        = OBJC_SIZED
  1393.                         msg[4]/msg[5] = Zeiger auf die DIAINFO-Struktur des
  1394.                                         Dialogs
  1395.  
  1396.                     -> Daten wurden an Applikation per Drag&Drop übergeben
  1397.                         msg[0]        = OBJC_DRAGGED
  1398.                         msg[4]/msg[5] = Zeiger auf DRAG_DROP-Struktur
  1399.  
  1400.                     -> Applikation hat sich per XAcc-2- oder AV-Protokoll
  1401.                        angemeldet
  1402.                         msg[0]        = XACC_AV_INIT
  1403.                         msg[3]        = Applikations-ID
  1404.                         msg[4]/msg[5] = Zeiger auf XAcc-Struktur
  1405.  
  1406.                     -> Applikation hat sich per XAcc-2- oder AV-Protokoll
  1407.                        abgemeldet
  1408.                         msg[0]        = XACC_AV_EXIT
  1409.                         msg[3]        = Applikations-ID
  1410.                         msg[4]/msg[5] = Zeiger auf XAcc-Struktur (Struktur
  1411.                                         ist nach vollständiger Abmeldung
  1412.                                         nicht mehr gültig
  1413.                                         (Struktur-Variable id<0)
  1414.  
  1415.                     -> Status eines Fenster hat sich geändert (z.B. wurde
  1416.                        das Fenster ikonifiziert/deikonifiziert). U.a. kann
  1417.                        sich auch das Fenster-Handle ändern!
  1418.                         msg[0]        = WIN_CHANGED
  1419.                         msg[4]/msg[5] = Zeiger auf die WIN-Struktur des
  1420.                                         Fensters oder NULL, falls alle
  1421.                                         Fenster betroffen sind
  1422.  
  1423.                     -> Scrollposition eines Fensters wurde geändert
  1424.                         msg[0]        = WIN_SCROLLED
  1425.                         msg[4]/msg[5] = Zeiger auf die WIN-Struktur des
  1426.                                         Fensters
  1427.                         msg[6]        = alte horizontale Position (hpos)
  1428.                         msg[7]        = alte vertikale Position (vpos)
  1429.  
  1430.     13. Dialog-Funktionen
  1431.         -----------------
  1432.  
  1433.         DIAINFO-Struktur:
  1434.         -----------------
  1435.  
  1436.         typedef struct
  1437.         {
  1438.             /* Dialog-Typ
  1439.                 CLOSED      -> geschlossen
  1440.                 OPENED      -> normaler Dialog
  1441.                 FLYING      -> fliegender Dialog
  1442.                 WINDOW      -> Fenster-Dialog
  1443.                 WIN_MODAL   -> modaler Fenster-Dialog */
  1444.             DIALMODE di_flag;
  1445.  
  1446.             /* Zeiger auf Objektbaum */
  1447.             OBJECT   *di_tree;
  1448.  
  1449.             /* Zeiger auf Fenster-Struktur */
  1450.             WIN      *di_win;
  1451.  
  1452.             /* alle weiteren Variablen dieser Struktur sind nur für INTERNE
  1453.                Zwecke */
  1454.         } DIAINFO;
  1455.  
  1456.         boolean open_dialog(OBJECT *tree,DIAINFO *info,char *title,
  1457.                 char *icon_title, OBJECT *icon, boolean center,
  1458.                 boolean grow_box,int dialog_mode,int edit, SLINFO **slider);
  1459.             -> Dialog öffnen (Rückgabewert ungleich Null, wenn Dialog ge-
  1460.                öffnet wurde)
  1461.             -> Parameter:
  1462.                 tree:
  1463.                     -> Zeiger auf Objektbaum
  1464.                 info:
  1465.                     -> Zeiger auf DIAINFO-Struktur (wird von dieser
  1466.                        Funktion initialisiert)
  1467.                 title:
  1468.                     -> Zeiger auf Fenster-Titel für Fensterdialoge
  1469.                 icon_title:
  1470.                     -> Zeiger auf Fenstertitel im ikonifizierten Zustand
  1471.                        oder NULL
  1472.                 icon:
  1473.                     -> Zeiger auf Objektbaum, der für die ikonifizierte
  1474.                        Darstellung benutzt wird, oder NULL (in diesem
  1475.                        Fall wird der globale Objektbaum 'iconified'
  1476.                        benutzt)
  1477.                 center:
  1478.                     TRUE  -> Dialog um Mauszeiger zentrieren
  1479.                     FALSE -> Dialog in Bildschirmmitte zentrieren
  1480.                              (sichtbarer Ausschnitt des Bildschirms
  1481.                              wird beachtet)
  1482.                     FAIL  -> Dialog an letzter Position öffnen (beim
  1483.                              ersten Öffnen analog wie FALSE)
  1484.                 grow_box:
  1485.                     -> sich vergrößernder Rechtecke zeichnen
  1486.                 dialog_mode:
  1487.                     -> Bitmap des Dialogtyps:
  1488.  
  1489.                         /* fliegender Dialog */
  1490.                         #define FLY_DIAL        1
  1491.  
  1492.                         /* Fenster-Dialog */
  1493.                         #define WIN_DIAL        2
  1494.  
  1495.                         /* Fenster-Dialog, sofern Fenster geöffnet werden
  1496.                            kann, ansonsten fliegender Dialog
  1497.                         #define AUTO_DIAL       (FLY_DIAL|WIN_DIAL)
  1498.  
  1499.                         /* modaler Fensterdialog */
  1500.                         #define MODAL           4
  1501.  
  1502.                         /* Fenster-Dialog mit Rahmen */
  1503.                         #define FRAME           8
  1504.  
  1505.                         /* Fenster-Dialog kann nicht ikonifiziert werden */
  1506.                         #define NO_ICONIFY      16
  1507.  
  1508.                         /* Die folgenden Elemente des Dialogfensters müssen
  1509.                            von der Anwendung ausgewertet u. gesetzt werden!
  1510.                            Dabei wird die Größe des Fensters automatisch
  1511.                            gesetzt, wenn WD_SET_SIZE übergeben wird. An-
  1512.                            sonsten darf die Größe NICHT verändert werden! */
  1513.  
  1514.                         /* Fenster-Dialog mit horizontalem Slider
  1515.                            (Slider,Pfeile rechts/links) */
  1516.                         #define WD_HSLIDER      256
  1517.  
  1518.                         /* Fenster-Dialog mit vertikalem Slider
  1519.                            (Slider,Pfeile hoch/runter) */
  1520.                         #define WD_VSLIDER      512
  1521.  
  1522.                         /* Fenster-Dialog mit Sizer */
  1523.                         #define WD_SIZER        1024
  1524.  
  1525.                         /* Fenster-Dialog mit Fuller */
  1526.                         #define WD_FULLER       2048
  1527.  
  1528.                         /* Fenster-Dialog mit Info-Zeile */
  1529.                         #define WD_INFO         4096
  1530.  
  1531.                         /* Größe bei WM_FULLED/WM_SIZED automatisch an-
  1532.                            passen (Nachricht OBJC_SIZED wird anschließend
  1533.                            an Anwendung geschickt) */
  1534.                         #define WD_SET_SIZE     8192
  1535.  
  1536.                 edit:
  1537.                     -> Objektnummer des Eingabefeldes, in welchem sich
  1538.                        der Cursor befinden soll (oder negativer Wert)
  1539.  
  1540.                 slider:
  1541.                     -> Zeiger auf Liste mit Adressen der SLINFO-Strukturen
  1542.                        (letzter Listen-Eintrag gleich NULL) der Slider des
  1543.                        Dialogs oder NULL, wenn die Slider nicht automatisch
  1544.                        verwaltet werden sollen
  1545.  
  1546.         void close_dialog(DIAINFO *dialog,boolean shrink_box);
  1547.             -> Dialog 'dialog' schließen und gegebenenfalls sich
  1548.                verkleinernde Rechtecke zeichnen (shrink_box!=0)
  1549.  
  1550.         void close_all_dialogs(void)
  1551.             -> alle geöffneten Dialoge schließen
  1552.  
  1553.         int X_Form_Do(DIAINFO **dialog)
  1554.             -> Bearbeitung der geöffneten Dialoge
  1555.             -> Zurückgegeben wird die Nummer des angewählten Exit-Objekts
  1556.                (bei Doppelklick ist Bit 15 (0x8000) gesetzt) oder die Werte
  1557.                W_ABANDON -> Abbruch der Dialogbearbeitung, alle Dialoge
  1558.                             wurden geschlossen (z.B. durch AC_CLOSE) bzw.
  1559.                             beim Aufruf der Funktion waren keine Dialoge
  1560.                             geöffnet
  1561.                W_CLOSED  -> Fensterdialog wurde geschlossen
  1562.             -> '*dialog' enthält (sofern ungleich NULL) einen Zeiger auf
  1563.                die DIAINFO-Struktur des aktuellen Dialogs
  1564.  
  1565.         int xdialog(OBJECT *tree,char *title,char *icon_title,OBJECT *icon,
  1566.                     boolean center,boolean grow_box,int dialog_mode);
  1567.             -> komplette Dialogbearbeitung (Dialog öffnen, bearbeiten und
  1568.                schließen), wobei diese Funktion nur verwendet werden sollte,
  1569.                wenn sonst kein Dialog geöffnet ist oder ein modaler oder
  1570.                fliegender Dialog geöffnet wird (z.B. um auf eine Benutzer-
  1571.                eingabe zu warten)
  1572.             -> Parameter und Rückgabewerte s. open_dialog() sowie
  1573.                X_Form_Do()
  1574.  
  1575.         int xalert(int default,int undo,int icon,BITBLK *user_icon,
  1576.                    int modal,int center,int width,
  1577.                    char *title,char *text,char *buttons)
  1578.             -> erweiterte Alertbox darstellen (zurückgeliefert wird der
  1579.                Index des ausgewählten Buttons oder FAIL im Fehlerfall)
  1580.             -> default:   Index des DEFAULT-Buttons oder negativer Wert
  1581.                undo:      Index des UNDO-Buttons oder negativer Wert
  1582.                icon:      Nummer des Icons oder negativer Wert
  1583.  
  1584.                 X_ICN_NONE:      /* kein Icon */
  1585.                 X_ICN_MAX:       /* maximale Icon-Nummer */
  1586.  
  1587.                 X_ICN_STOP:      /* Stop-Schild (Hinweis) */
  1588.                 X_ICN_QUESTION:  /* Fragezeichen (Nachfrage) */
  1589.                 X_ICN_ALERT:     /* Ausrufezeichen (Warnung) */
  1590.  
  1591.                 X_ICN_DISC_ERR:  /* Disketten-I/O-Fehler */
  1592.                 X_ICN_ERROR:     /* Bomben-Fehler */
  1593.                 X_ICN_FLOPPY:    /* Disketten-Station */
  1594.                 X_ICN_DISC:      /* Diskette */
  1595.                 X_ICN_INFO:      /* Informations-Zeichen */
  1596.                 X_ICN_PRT_ERR:   /* Drucker-I/O-Fehler */
  1597.  
  1598.                user_icon: Zeiger auf benutzerdefiniertes Icon oder NULL
  1599.                modal:     System-/Applikations-modale Alert-Box
  1600.  
  1601.                 #define SYS_MODAL           0 /* System-Modal */
  1602.                 #define APPL_MODAL          1 /* Applikations-Modal */
  1603.  
  1604.                center:    Ausrichtung der Buttons
  1605.  
  1606.                 #define BUTTONS_CENTERED    0 /* zentriert */
  1607.                 #define BUTTONS_LEFT        1 /* linksbündig */
  1608.                 #define BUTTONS_RIGHT       2 /* rechtsbündig */
  1609.  
  1610.                width:     einheitliche Breite der Buttons (width!=0)
  1611.                title:     Zeiger auf Fenster-Titel bei applikationsmodalen
  1612.                           bzw. Überschrift bei systemmodalen Dialogen
  1613.                text:      Zeiger auf Text (maximale 16 Zeilen getrennt
  1614.                           durch '|'). Die Textattribute können durch die
  1615.                           folgenden Zeichen (in beliebiger Reihenfolge)
  1616.                           am ANFANG einer Textzeile gesetzt werden:
  1617.  
  1618.                           Fett          = '!'
  1619.                           Unterstrichen = '_'
  1620.                           Kursiv        = '/'
  1621.                           Hell          = '~'
  1622.                           Umrandet      = '#'
  1623.                           Schattiert    = '@'
  1624.  
  1625.                buttons:   Button-Text (maximal 6 Buttons getrennt durch
  1626.                           '|', Hotkeymarkierung durch '[')
  1627.  
  1628.         char ascii_box(char *title)
  1629.             -> Sonderzeicheneingabebox öffnen (Parameter s. open_dialog())
  1630.                (Funktion nur verfügbar, wenn Library nicht als Light-
  1631.                 Version übersetzt wurde)
  1632.             -> Rückgabewert: ausgewähltes Zeichen
  1633.  
  1634.     14. Fenster-Funktionen
  1635.         ------------------
  1636.  
  1637.         WIN-Struktur:
  1638.         -------------
  1639.  
  1640.         typedef struct
  1641.         {
  1642.              /* Handle des Fensters (handle>0, falls Fenster geöffnet) */
  1643.              int handle;
  1644.  
  1645.              /* VDI-Handle der zum Fenster gehörenden VDI-Workstation
  1646.                (nach Aufruf von open_window() ist die Library-Workstation
  1647.                 'x_handle' als VDI-Workstation gesetzt)
  1648.              int vdi_handle;
  1649.  
  1650.              /* Bitmap der Fensterelemente (s. wind_create) */
  1651.              int gadgets;
  1652.  
  1653.              /* Bitmap des Fenster-Status */
  1654.              char iconified;
  1655.  
  1656.                  #define ICONIFIED  1  /* Fenster ikonifiziert (MTOS) */
  1657.                  #define SHADE      2  /* Fenster eingeklappt (Winx 2.3) */
  1658.                  #define ICFS       4  /* Fenster ikonifiziert (ICFS) */
  1659.  
  1660.              /* Fenster hat maximale Ausmaße */
  1661.              char fulled;
  1662.  
  1663.              /* Position des Mauszeigers beim letzten Aufruf von
  1664.                 window_mouse() oder window_set_mouse() (Variable ist
  1665.                 ungültig bei Fensterdialogen!) */
  1666.              int inside;
  1667.  
  1668.                  FAIL:  Fenster ist im Hintergrund
  1669.                  FALSE: Mauszeiger außerhalb des Arbeitsbereiches
  1670.                  TRUE:  Mauszeiger innerhalb des Arbeitsbereiches
  1671.  
  1672.              /* Größe (1-1000)/Position (0-1000) des horiz. Sliders */
  1673.              int sl_hpos,sl_hsize;
  1674.  
  1675.              /* Größe (1-1000)/Position (0-1000) des vert. Sliders */
  1676.              int sl_vpos,sl_vsize;
  1677.  
  1678.              /* Zeiger auf SCROLL-Struktur oder NULL */
  1679.              SCROLL *scroll;
  1680.  
  1681.              /* Zeiger auf Fenster-Titel oder NULL */
  1682.              char   *name;
  1683.  
  1684.              /* Zeiger auf Titel im ikonifizierten Zustand oder NULL */
  1685.              char   *icon_name;
  1686.  
  1687.              /* minimale Fensterbreite/-höhe */
  1688.              int min_w,min_h;
  1689.  
  1690.              /* maximale Fensterausmaße */
  1691.              GRECT max;
  1692.  
  1693.              /* Die folgenden Variablen beziehen sich IMMER auf den
  1694.                 nicht ikonifizierten Zustand des Fensters! */
  1695.  
  1696.              /* aktuelle Fensterausmaße */
  1697.              GRECT curr;
  1698.  
  1699.              /* vorherige Fensterausmaße */
  1700.              GRECT prev;
  1701.  
  1702.              /* Fensterarbeitsbereich */
  1703.              GRECT work;
  1704.  
  1705.             /* alle weiteren Variablen dieser Struktur sind für
  1706.                INTERNE Zwecke reserviert */
  1707.         } WIN;
  1708.  
  1709.         SCROLL-Struktur:
  1710.         ----------------
  1711.  
  1712.         typedef struct
  1713.         {
  1714.             /* automatisches Scrolling (scroll!=0) oder nur Slider
  1715.                setzen und neue Werte der SCROLL-Struktur berechnen
  1716.                (scroll==0) */
  1717.             int scroll;
  1718.  
  1719.             /* Index des Objekts, welches beim automatische Scrolling
  1720.                (scroll!=0) eines Dialogs neugezeichnet werden soll. Hier
  1721.                kann natürlich immer das Wurzelobjekt angegeben werden
  1722.                (Clipping wird von der Library durchgeführt), aber aus Ge-
  1723.                schwindigkeitsgründen sollte man nur das betreffende Objekt
  1724.                angeben */
  1725.             int obj;
  1726.  
  1727.             /* Breite des Bereichs am linken/rechten Rand, der nicht
  1728.                verschoben werden darf (z.B. eine Toolbar). Diese Werte
  1729.                werden auch für die Berechnung der Sliderposition/-größe
  1730.                benötigt */
  1731.             int tbar_l,tbar_r;
  1732.  
  1733.             /* Breite des Bereichs am oberen/unteren Rand, der nicht
  1734.                verschoben werden darf (z.B. eine Toolbar) Diese Werte
  1735.                werden auch für die Berechnung der Sliderposition/-größe
  1736.                benötigt */
  1737.             int tbar_u,tbar_d;
  1738.  
  1739.             /* Breite/Höhe einer Spalte/Zeile
  1740.                (z.B. bei Textfenstern die Fontgröße, bei Grafikfenstern
  1741.                 meistens 1) */
  1742.             int px_hline,px_vline;
  1743.  
  1744.             /* Horizontale/vertikale Position des Fensterinhalts
  1745.                (in Spalten/Zeilen) */
  1746.             int hpos,vpos;
  1747.  
  1748.             /* Horizontale/vertikale Fenstergröße (in Spalten/Zeilen) */
  1749.             int hsize,vsize;
  1750.  
  1751.             /* Horizontale/vertikale Seitengröße (in Spalten/Zeilen)
  1752.                (diese Variablen dürfen nicht verändert werden bzw. werden
  1753.                von der Library gesetzt!) */
  1754.             int hpage,vpage;
  1755.  
  1756.             /* Horizontale/vertikale Schrittweite (in Spalten/Zeilen) */
  1757.             int hscroll,vscroll;
  1758.  
  1759.              /* alle weiteren Variablen dieser Struktur sind für
  1760.                INTERNE Zwecke reserviert */
  1761.         } SCROLL;
  1762.  
  1763.         WICHTIG:
  1764.         Es dürfen nur noch diejenigen AES-Fensterroutinen verwendet
  1765.         werden, deren Funktionalität nicht von einer äquivalenten
  1766.         Library-Routine angeboten wird bzw. wenn das Fenster nicht
  1767.         von der Library verwaltet wird (Fenster 0 (Desktop) oder
  1768.         Fenster anderer Applikationen), dürfen alle AES-wind-Funktionen
  1769.         verwendet werden.
  1770.         Bei geöffneten systemmodalen Dialogen oder Popups werden Nach-
  1771.         richten und zu setzende Werte automatisch bis zum Schließen der
  1772.         der Dialoge/Popups gepuffert und dann an die Ereignisverwaltung
  1773.         weitergeleitet.
  1774.  
  1775.         WIN *open_window(char *title,char *icon_title,char *info,
  1776.                          OBJECT *icon,int gadgets,int box,
  1777.                          int min_w,int min_h,
  1778.                          GRECT *max,GRECT *curr,SCROLL *scroll,
  1779.                          void (*redraw)(WIN *,GRECT *))
  1780.             -> Fenster öffnen und bei einem evtl. vorhandenen AV-Server
  1781.                anmelden (AV_ACCWINDOPEN) sowie egebenenfalls die Hinter-
  1782.                grundbedienung aktivieren
  1783.             -> Parameter:
  1784.                title:      Zeiger auf Fenstertitel oder NULL
  1785.                icon_title: Zeiger auf Fenstertitel im ikonifizierten Zu-
  1786.                            stand oder NULL
  1787.                info:       Zeiger auf Infozeile oder NULL
  1788.                gadgets:    Bitmap der Fensterelemente wie bei
  1789.                            wind_create()
  1790.                icon:       Zeiger auf Objektbaum, der für die ikonifizierte
  1791.                            Darstellung benutzt wird, oder NULL (in diesem
  1792.                            Fall wird der globale Objektbaum 'iconified'
  1793.                            benutzt)
  1794.                box:        sich vergrößernde Rechtecke zeichnen (box!=0)
  1795.                min_w:      minimale Fensterbreite
  1796.                min_h:      minimale Fensterhöhe
  1797.                max:        maximale Fensterausmaße
  1798.                            max->g_x/g_y: minimale linke, obere Fenster-
  1799.                                          koordinaten (normalerweise die
  1800.                                          entsprechenden Koordinaten des
  1801.                                          Desktopfensters 'desk')
  1802.                            max->g_w/g_h: maximale Fensterbreite/-höhe
  1803.                curr:       Fensterausmaße
  1804.                scroll:     Zeiger auf initialisierte SCROLL-Struktur für
  1805.                            automatisches Scrolling oder NULL. Wurde die
  1806.                            Scroll-Position geändert, so wird eine Nachricht
  1807.                            WIN_SCROLLED verschickt. U.a. werden von der
  1808.                            Library in diesem Fall auch Slidergröße und
  1809.                            -position automatisch gesetzt.
  1810.                redraw:     Routine, die den Fenster-Redraw übernimmt. Dabei
  1811.                            muß weder das übergebene Rechteck mit der Recht-
  1812.                            liste geschnitten noch das Clipping der VDI-
  1813.                            Workstation gesetzt werden! (VDI-Handle der
  1814.                            WIN-Struktur nach Aufruf von open_window()
  1815.                            gegebenenfalls auf anderen Wert als die globale
  1816.                            Library-Workstation 'x_handle' setzen)
  1817.                            Wird für 'redraw' NULL übergeben, so wird
  1818.                            die Nachricht WM_REDRAW (wie üblich) weiterge-
  1819.                            leitet.
  1820.             -> Rückgabewert: Zeiger auf WIN-Struktur oder NULL
  1821.  
  1822.         void window_reinit(WIN *win,char *title,char *icon_title,
  1823.                            char *info,int home)
  1824.             -> Fenster 'win' reinitialisieren und neuzeichnen. U.a.
  1825.                wird gegebenenfalls die SCROLL-Struktur auf gültige
  1826.                Werte gesetzt und die Größe des Fensters an die maximalen
  1827.                bzw. minimalen Ausmaße angepaßt.
  1828.             -> Parameter:
  1829.                title:      Zeiger auf Fenstertitel oder NULL
  1830.                icon_title: Zeiger auf Fenstertitel im ikonifizierten Zu-
  1831.                            stand oder NULL
  1832.                info:       Zeiger auf Infozeile oder NULL
  1833.                home:       Scroll-Position in linke obere Ecke (home!=0)
  1834.  
  1835.         int close_window(WIN *window,int box)
  1836.             -> Fenster 'window' schließen und gegebenenfalls (box!=0) sich
  1837.                verkleinernde Rechtecke zeichnen. Außerdem wird das Fenster
  1838.                bei einem evtl. vorhandenem AV-Server abgemeldet
  1839.             -> Rückgabewert gleich Null, wenn ein Fehler auftrat
  1840.  
  1841.         void close_all_windows(void)
  1842.             -> Alle geöffneten Fenster schließen. Sind vorher noch Dialoge
  1843.                geöffnet, so werden diese ebenfalls geschlossen.
  1844.  
  1845.         void redraw_window(WIN *win,GRECT *area)
  1846.             -> Löst einen Redraw über das Rechteck 'area' (area!=NULL) des
  1847.                Fensters 'win' oder den gesamten Fensterbereich (area==NULL)
  1848.                aus. Wurde für das Fenster kein Redraw-Handler angemeldet,
  1849.                so wird eine WM_REDRAW-Nachricht verschickt.
  1850.  
  1851.         void window_scroll_slider(WIN *win,int vh)
  1852.             -> horizontalen (vh==HOR_SLIDER) oder vertikalen
  1853.                (vh==VERT_SLIDER) Slider des Fensters 'win' anhand der
  1854.                Werte der Scroll-Struktur setzen
  1855.  
  1856.         void scroll_window(WIN *win,int mode,GRECT *area)
  1857.             -> Fensterinhalt des Fensters 'win' in Abhängigkeit vom Para-
  1858.                meter 'mode' scrollen (Fenster muß über eine SCROLL-Struktur
  1859.                verfügen!), wobei sowohl Slidergröße als auch -position
  1860.                automatisch angepaßt werden.
  1861.             -> Parameter:
  1862.                 area: Bereich des Fensters oder NULL für gesamtes Fenster
  1863.                       abzüglich der in der SCROLL-Struktur angegebenen
  1864.                       Toolbar-Bereiche
  1865.                 mode:
  1866.                 /* an Anfang/Ende der Zeile */
  1867.                 LINE_START,LINE_END
  1868.  
  1869.                 /* an Anfang/Ende des Fensterinhalts */
  1870.                 WIN_START,WIN_END
  1871.  
  1872.                 /* Position (hpos,vpos) bereits gesetzt (wird automatisch
  1873.                    an gültigen Bereich angepaßt) */
  1874.                 WIN_SCROLL
  1875.  
  1876.                 /* Seite nach links/oben/rechts/unten */
  1877.                 PAGE_LEFT,PAGE_UP,PAGE_RIGHT,PAGE_DOWN
  1878.  
  1879.                 /* Zeile/Spalte nach links/oben/rechts/unten */
  1880.                 LINE_LEFT,LINE_UP,LINE_RIGHT,LINE_DOWN
  1881.  
  1882.         WIN *get_window(int handle)
  1883.             -> WIN-Struktur zum Fenster 'handle' ermitteln
  1884.             -> Rückgabewert gleich NULL, falls Struktur nicht gefunden
  1885.                werden konnte
  1886.  
  1887.         WIN *get_top_window(void)
  1888.             -> WIN-Struktur zum obersten Fenster ermitteln
  1889.             -> Rückgabewert gleich NULL, falls Struktur nicht gefunden
  1890.                werden konnte (Fenster gehört anderer Applikation oder
  1891.                kein Fenster geöffnet)
  1892.  
  1893.         int window_first(WIN *win,GRECT *rect);
  1894.         int window_next(WIN *win,GRECT *rect);
  1895.             -> Verkürzte Aufrufe von wind_xget(handle,WF_FIRSTXYWH,...)
  1896.                bzw. wind_xget(handle,WF_NEXTXYWH,...).
  1897.             -> Rückgabewert s. wind_xget()
  1898.  
  1899.         void window_size(WIN *win,GRECT *size)
  1900.             -> Ausmaße des Fensters 'win' auf 'size' setzen
  1901.                (im ikonifizierten Zustand wird die Größe erst nach der
  1902.                 Deikonifizierung gesetzt)
  1903.             -> Wurde eine SCROLL-Struktur beim Öffnen des Fenster
  1904.                übergeben, so werden von dieser Funktion auch Slidergröße
  1905.                und -position automatisch gesetzt, wobei evtl. der Fenster-
  1906.                inhalt verschoben wird.
  1907.  
  1908.         void window_slider(WIN *win,int vh,int pos,int size)
  1909.             -> Vertikalen (vh==VERT_SLIDER) oder horizontalen
  1910.                (vh==HOR_SLIDER) Slider des Fensters 'win' setzen
  1911.                (im ikonifizierten Zustand werden die Werte erst nach der
  1912.                 Deikonifizierung gesetzt)
  1913.             -> Parameter:
  1914.                pos:  Position des Sliders (0-1000) oder FAIL
  1915.                size: Größe des Sliders (1-1000) oder
  1916.                FAIL
  1917.  
  1918.         void window_set_mouse(WIN *win,int in,int out,
  1919.                               MFORM *in_form,MFORM *out_form)
  1920.             -> Form des Mauszeigers innerhalb und außerhalb des Arbeits-
  1921.                bereiches des Fensters 'win' festlegen und setzen. Der
  1922.                Mauszeiger wird i.A. automatisch verwaltet, wobei das
  1923.                Verlassen/Betreten des Arbeitsbereiches von der Anwendung
  1924.                überwacht werden muß (s. Beispielquelltext 'WINVIEW.C').
  1925.                Der Arbeitsbereich selber umfaßt dabei den Arbeitsbereich
  1926.                des Fensters abzüglich der evtl. angegebenen Ausmaße von
  1927.                "Toolbars".
  1928.                Diese Funktion hat keine Auswirkung auf Fensterdialoge!
  1929.             -> Parameter:
  1930.                in, in_form:   Mausform innerhalb des Arbeitsbereichs
  1931.                               (Bedeutung s. graf_mouse()). Wird für den
  1932.                               Parameter 'in' ein negativer Wert übergeben,
  1933.                               so wird die Mausform nicht gesetzt (dies ist
  1934.                               voreingestellt)
  1935.                out, out_form: Mausform außerhalb des Arbeitsbereichs, Be-
  1936.                               deutung s.o.
  1937.  
  1938.         void window_mouse(WIN *win)
  1939.             -> Mauszeiger des Fensters 'win' entsprechend den durch
  1940.                window_set_mouse() getroffenen Einstellungen setzen
  1941.  
  1942.         void window_name(WIN *win,char *title,char *icon_title)
  1943.             -> Titel des Fensters 'win' setzen
  1944.             -> Parameter:
  1945.                title:      Zeiger auf Fenstertitel oder NULL
  1946.                icon_title: Zeiger auf Fenstertitel im ikonifizierten Zu-
  1947.                            stand oder NULL
  1948.  
  1949.         void window_info(WIN *win,char *info)
  1950.             -> Info-Zeile des Fensters 'win' setzen (im ikonifizierten
  1951.                Zustand wird die Info-Zeile erst nach der Deikonifizierung
  1952.                gesetzt)
  1953.             -> Parameter:
  1954.                info: Zeiger auf Infozeile oder NULL
  1955.  
  1956.         void window_top(WIN *win)
  1957.             -> Fenster 'win' nach oben bringen (entspricht
  1958.                wind_set(handle,WF_TOP))
  1959.  
  1960.         void window_bottom(WIN *win)
  1961.             -> Fenster 'win' nach unten legen (entspricht
  1962.                wind_set(handle,WF_BOTTOM))
  1963.  
  1964.         WIN *window_find(int x,int y)
  1965.             -> WIN-Struktur des Fensters an den Koordinaten (x,y)
  1966.                ermitteln
  1967.             -> Rückgabewert gleich NULL, falls Struktur nicht gefunden
  1968.                werden konnte
  1969.  
  1970.         void window_calc(int wctype,int kind,GRECT *in,GRECT *out)
  1971.             -> Entspricht von der Funktionalität der AES-Funktion
  1972.                wind_calc(), nur daß anstatt einzelner Parameter Zeiger
  1973.                auf GRECT-Strukturen erwartet werden
  1974.  
  1975.         void window_border(int kind,int x,int y,int w,int h,GRECT *out)
  1976.             -> Koordinaten des Randbereichs (WC_BORDER) aus der linken,
  1977.                oberen Ecke (x,y) des Fensters und der Breite/Höhe des
  1978.                Arbeitsbereiches (w,h) berechnen und im Recheck 'out'
  1979.                zurückgeben. Dabei wird das Ausgaberechteck automatisch
  1980.                auf den Desktop begrenzt.
  1981.  
  1982.         void CycleCloseWindows(char cycle_hot,char close_hot,int cycle_menu,
  1983.                                int close_menu)
  1984.             -> Hotkeys (+Control-Taste) und Menüpunkte für die Funktionen
  1985.                'Fenster wechseln' sowie 'Fenster schließen' definieren.
  1986.                Beachtet werden alle Fensterdialoge sowie Fenster, die mit
  1987.                den Funktionen open_window() und close_window() geöffnet bzw.
  1988.                geschlossen werden. Der Menütitel wird nur dann deselektiert,
  1989.                wenn der Zeiger auf die Menüleiste 'menu' gesetzt ist!
  1990.             -> Parameter:
  1991.                 cycle_hot,close_hot:
  1992.                   -> Hotkey-Buchstaben oder Null (voreingestellt sind
  1993.                      die Zeichen 'W' und 'U')
  1994.                 cycle_menu,close_menu:
  1995.                   -> Objektnummern der Pulldown-Menüeinträge oder neg. Werte
  1996.  
  1997.     15. Popup-Funktion
  1998.         --------------
  1999.  
  2000.         POPUP-Struktur:
  2001.         ---------------
  2002.             typedef struct
  2003.             {
  2004.                 /* Zeiger auf DIAINFO-Struktur des Parent-Dialogs
  2005.                    oder NULL */
  2006.                 DIAINFO *p_info;
  2007.  
  2008.                 /* Zeiger auf Objektbaum des Popups */
  2009.                 OBJECT  *p_menu;
  2010.  
  2011.                 /* Objektnummer des Info-Objekts (meistens Text links vom
  2012.                    Popup-Button) oder negativer Wert */
  2013.                 int     p_parent;
  2014.  
  2015.                 /* Objektnummer des Popup-Buttons oder negativer Wert */
  2016.                 int     p_button;
  2017.  
  2018.                 /* Objektnummer des Cycle-Buttons (dabei muß es sich nicht
  2019.                    um den erweiterten Typ CYCLE_BUTTON handeln) oder
  2020.                    negativer Wert */
  2021.                 int     p_cycle;
  2022.  
  2023.                 /* Beim Erreichen des ersten/letzten Eintrags mit den Cur-
  2024.                    sor-Tasten Hoch/Runter wird zum letzten/ersten Eintrag
  2025.                    gesprungen */
  2026.                 boolean p_wrap;
  2027.  
  2028.                 /* Der Text des Popup-Buttons wird automatisch auf den
  2029.                    Wert des aktuellen Eintrags gesetzt und nach dem Ende
  2030.                    der Popup-Bearbeitung neugezeichnet */
  2031.                 boolean p_set;
  2032.             } POPUP;
  2033.  
  2034.         int Popup(POPUP *popup,int mode,int center,int x,int y,
  2035.                   int *index,int select)
  2036.             -> Popup 'popup' öffnen, bearbeiten und wieder schließen
  2037.             -> mode: Popup-Modus
  2038.  
  2039.                 #define POPUP_BTN   0   /* Popup-Button wurde angeklickt */
  2040.                 #define POPUP_CYCLE 1   /* Cycle-Button wurde angeklickt */
  2041.                 #define POPUP_CHECK 2   /* Häkchen vor aktuellem Eintrag */
  2042.  
  2043.                 #define POPUP_BTN_CHK   (POPUP_BTN|POPUP_CHECK)
  2044.                 #define POPUP_CYCLE_CHK (POPUP_CYCLE|POPUP_CHECK)
  2045.                 #define POPUP_RADIO     POPUP_BTN_CHK
  2046.                 #define POPUP_SELECT    POPUP_BTN
  2047.  
  2048.             -> center: Position des Popups
  2049.  
  2050.                 #define CENTER    1 /* in Bildschirm zentrieren */
  2051.                 #define MOUSEPOS  2 /* um Mauszeiger zentrieren */
  2052.                 #define XPOS      3 /* X-Koordinate x, vertikal
  2053.                                        um Mauszeiger zentrieren */
  2054.                 #define YPOS      4 /* Horizontal um Mauszeiger zentrieren,
  2055.                                        Y-Koordinate y */
  2056.                 #define XYPOS     5 /* Koordinaten (x,y) */
  2057.                 #define OBJPOS    6 /* um aktuellen Eintrag zentrieren oder
  2058.                                        wie XYPOS */
  2059.  
  2060.             -> select: aktueller Eintrag oder negativer Wert
  2061.  
  2062.             -> zurückgegeben wird die Objektnummer des selektierten Eintrags
  2063.                (oder 0) sowie in '*index' (sofern index!=NULL) der Index
  2064.                des selektierten Eintrags. Ist Bit 15 (0x8000) des Rückgabe-
  2065.                wertes gesetzt, so wurde das Objekt per Doppelklick oder bei
  2066.                gedrückter Shift-Taste ausgewählt
  2067.  
  2068.     16. XAcc-2- und AV-Protokoll-Funktionen
  2069.         -----------------------------------
  2070.  
  2071.         Die Library verwaltet intern alle An- und Abmeldungen der Proto-
  2072.         kolle XAcc2 und AV selbständig.
  2073.         Ebenso werden die Nachrichten AV_SENDKEY sowie ACC_KEY automatisch
  2074.         in Keyboard-Events umgewandelt bzw. nicht ausgewertete Keyboard-
  2075.         Events werden als AV_SENDKEY bzw. ACC_KEY an den AV-Server oder die
  2076.         Hauptapplikation geschickt.
  2077.         Die Nachricht AV_PATH_UPDATE wird u.a. automatisch beim Aufruf der
  2078.         Funktion scrp_changed verschickt und sollte ansonsten nicht ver-
  2079.         schickt werden. Die Nachrichten VA_START und VA_DRAGACCWIND werden
  2080.         automatisch ausgewertet und in eine ARGS_DRAG-Nachricht umgewandelt.
  2081.         Weiterhin werden nicht unterstützte XAcc2-Nachrichten mit einer
  2082.         ACC_ACK-FALSE-Nachricht beantwortet und per ACC_TEXT empfangene
  2083.         Texte werden im das aktuelle Eingabefeld im obersten Dialog einge-
  2084.         fügt. Ist das oberste Fenster kein Dialog, so wird die Nachricht
  2085.         an die Applikation weitergeleitet, sofern diese Nachricht unter-
  2086.         stützt wird.
  2087.  
  2088.         Alle Fensterdialoge sowie Fenster, die mit den Funktionen
  2089.         open_window() und close_window() geöffnet bzw. geschlossen werden
  2090.         (abgesehen von applikationsmodalen Alertboxen), werden bei einem
  2091.         eventuell vorhandenen AV-Server an- bzw. abgemeldet.
  2092.  
  2093.         #define XACC    1   /* XAcc-Protokoll */
  2094.         #define AV      2   /* AV-Protokoll */
  2095.  
  2096.         XAcc-Struktur:
  2097.         --------------
  2098.         typedef struct
  2099.         {
  2100.             /* unterstützte Protokolle (Bit 0: XAcc, Bit 1: AV) */
  2101.             int     flag;       /* XACC/AV */
  2102.  
  2103.             /* Applikations-Identifikation */
  2104.             int     id;              /* XAcc/AV-Protokoll */
  2105.  
  2106.             /* Bitmap der unterstützten AV/VA-Nachrichten (Format
  2107.                s. Funktion init_gem())
  2108.             int     av_msgs,va_msgs; /* nur AV-Protokoll */
  2109.  
  2110.             /* Highbyte: Programmversionsnummer
  2111.                Lowbyte:  unterstützte Nachrichtengruppen */
  2112.             int     version;         /* nur XAcc-Protokoll */
  2113.  
  2114.             /* ID des Menüeintrags im Accessory-Menü */
  2115.             int     menu_id;         /* nur XAcc-Protokoll */
  2116.  
  2117.             /* AV-Programmname (8 Zeichen) für appl_find */
  2118.             char    name[];          /* nur AV-Protokoll */
  2119.  
  2120.             /* (erweiterter) XAcc2-Programmname oder NULL */
  2121.             char    *xname;          /* nur XAcc-Protokoll */
  2122.  
  2123.             /* Zeiger auf 'XDSC'-Informationen oder NULL */
  2124.             char    *xdsc;           /* nur XAcc-Protokoll */
  2125.         } XAcc;
  2126.  
  2127.         void XAccBroadCast(int msg[8])
  2128.             -> Nachrichtenpuffer 'msg' an alle erreichbaren Applikationen
  2129.                verschicken
  2130.  
  2131.         int XAccSendAck(int sendto, int answer)
  2132.             -> ACC_ACK-Rückmeldung 'answer' an Applikation 'sendto' senden
  2133.                (OK: answer!=0, Fehler: answer==0)
  2134.             -> Rückgabewert:
  2135.                 TRUE:  Okay
  2136.                 FALSE: Fehler
  2137.  
  2138.         int XAccSendKey(int sendto, int scan, int state)
  2139.             -> Tasten-Druck (Scancode 'scan', Status der Umschalttasten
  2140.                'state') an Applikation 'sendto' senden
  2141.             -> Rückgabewert:
  2142.                 TRUE:   Okay
  2143.                 FALSE:  Fehler
  2144.                 FAIL:   Timeout (keine Bestätigung des Empfängers)
  2145.  
  2146.         int XAccSendText(int sendto, char *txt)
  2147.             -> Zeichenkette 'txt' an Applikation 'sendto' senden
  2148.             -> Rückgabewert:
  2149.                 TRUE:   Okay
  2150.                 FALSE:  Fehler
  2151.                 FAIL:   Timeout (keine Bestätigung des Empfängers)
  2152.  
  2153.         int XAccSendMeta(int sendto, int last, char *data, long len)
  2154.             -> Metafile-Block 'data' der Länge 'len' an Applikation 'sendto'
  2155.                senden (last!=0 -> letzter Datenblock)
  2156.             -> Rückgabewert:
  2157.                 TRUE:   Okay
  2158.                 FALSE:  Fehler
  2159.                 FAIL:   Timeout (keine Bestätigung des Empfängers)
  2160.  
  2161.         int XAccSendImg(int sendto, int last, char *data, long len)
  2162.             -> GEM-Image-Block 'data' der Länge 'len' an Applikation 'sendto'
  2163.                senden (last!=0 -> letzter Datenblock)
  2164.             -> Rückgabewert:
  2165.                 TRUE:   Okay
  2166.                 FALSE:  Fehler
  2167.                 FAIL:   Timeout (keine Bestätigung des Empfängers)
  2168.  
  2169.         int AvSendMsg(int sendto,int msg_id,int msg[8])
  2170.             -> (AV-) Nachricht 'msg_id' an Applikation 'sendto' senden
  2171.                (Message-Puffer msg[3]-msg[7] enthält gegebenenfalls weitere
  2172.                Daten)
  2173.             -> Rückgabewert:
  2174.                 TRUE:  Okay
  2175.                 FALSE: Fehler
  2176.  
  2177.         XAcc *find_xacc_xdsc(int app_id,char *xdsc)
  2178.             -> erweiterten XAcc-Programmnamen der Applikation 'app_id' nach
  2179.                Zeichenkette 'xdsc' durchsuchen (app<0 -> alle XAcc-Appli-
  2180.                kationen durchsuchen)
  2181.             -> Rückgabewert enthält Zeiger auf XAcc-Struktur der
  2182.                Applikation, deren XAcc-Programmname die Zeichenkette ent-
  2183.                hält, oder NULL, wenn die Zeichenkette nicht gefunden wurde
  2184.  
  2185.         XAcc *find_id(int app_id)
  2186.             -> XAcc-Struktur der Applikation 'app_id' ermitteln oder NULL,
  2187.                wenn es sich um keine XAcc-Applikation handelt
  2188.  
  2189.         XAcc *find_app(int first)
  2190.             -> XAcc-Struktur der ersten (first!=0) oder der nächsten
  2191.                (first==0) angemeldeten Applikation ermitteln (Rückgabewert
  2192.                gleich NULL, wenn keine weitere Applikation gefunden wurde)
  2193.  
  2194.         int AppLoaded(char *name)
  2195.             -> Ermittelt die Applikations-ID der Anwendung mit dem
  2196.                Dateinamen 'name', welcher auch Pfad- und Laufwerksangaben
  2197.                enthalten darf.
  2198.             -> Rückgabewert: Applikations-ID oder negativer Wert
  2199.  
  2200.      17. Drag & Drop-Funktionen
  2201.          ----------------------
  2202.  
  2203.         DRAG_DROP-Struktur:
  2204.         -------------------
  2205.  
  2206.         typedef struct
  2207.         {
  2208.             /* Art der Parameterübergabe */
  2209.             int dd_type;
  2210.  
  2211.                 #define AV_DRAG     0 /* AV/Gemini-Drag&Drop */
  2212.                 #define AV_START    1 /* VA_START-Nachricht */
  2213.                 #define MINT_DRAG   2 /* MTOS-Drag&Drop */
  2214.  
  2215.             /* Applikations-ID des Senders */
  2216.             int dd_originator;
  2217.  
  2218.             /* Mausposition (oder negative Werte, falls nicht vom
  2219.                Benutzer verursacht bzw. Hintergrundfenster betroffen) */
  2220.             int dd_mx,dd_my;
  2221.  
  2222.             /* Status der Umschalttasten */
  2223.             int dd_kstate;
  2224.  
  2225.             /* Zeiger auf (Datei-) Namen oder NULL */
  2226.             char *dd_name;
  2227.  
  2228.             /* Zeiger auf Argumente (z.B. Kommandozeile) oder NULL. Die
  2229.                einzelnen Argumente/Dateinamen sind durch Leerzeichen ge-
  2230.                trennt, wobei Argumente, die Leerzeichen enthalten, inner-
  2231.                halb von Hochkommatas stehen (z.B. 'meine Datei'). Doppelte
  2232.                Hochkommatas stehen dann für ein einzelnes Hochkommata
  2233.                (z.B. 'Christian''s Datei') */
  2234.             char *dd_args;
  2235.  
  2236.             /* Zeiger auf übergebene Daten oder NULL (dieser Speicher-
  2237.                bereich darf NICHT zur weiteren Verwendung benutzt wer-
  2238.                den, d.h. wird wieder freigegeben!) */
  2239.             char *dd_mem;
  2240.  
  2241.             /* Länge der in 'dd_mem' übergebenen Daten oder Null */
  2242.             long dd_size;
  2243.  
  2244.             /* Extension der in 'dd_mem' übergebenen Daten oder Leer-
  2245.                string ""
  2246.             char dd_ext[4];
  2247.  
  2248.             /* Zeiger auf WIN-Struktur des Fensters, auf das die Daten
  2249.                gezogen wurden, oder NULL, falls Hintergrund bzw. nicht
  2250.                vom Benutzer verursacht */
  2251.             WIN *dd_win;
  2252.         } DRAG_DROP;
  2253.  
  2254.         WICHTIG:
  2255.         --------
  2256.         Per Drag&Drop können nur dann Daten empfangen werden, wenn mit
  2257.         Hilfe der Funktion Event_Handler() ein Ereignis-Handler angemeldet
  2258.         wurde, der die Drag&Drop-Nachricht 'OBJC_DRAGGED' auswertet.
  2259.  
  2260.         void SetDragDrop(int any_extension,char *exts)
  2261.              -> gewünschte/bevorzugte Dateierweiterungen für das Drag&Drop-
  2262.                 Protokoll festlegen. Dabei zeigt 'exts' auf eine Zeichen-
  2263.                 kette mit DD_EXTSIZE Zeichen (mit Nullbytes auffüllen), die
  2264.                 die gewünschten Erweiterungen (z.B. ".TXT.ASC.ARGS") ent-
  2265.                 hält, wobei die Erweiterungen jeweils 4 Zeichen umfassen
  2266.                 müssen und 'ARGS' für Argumente steht. Wird für den
  2267.                 Parameter 'any_extension' TRUE übergeben, so wird jede
  2268.                 Erweiterung akzeptiert. (voreingestellt ist, daß nur Argu-
  2269.                 mente entgegengenommen werden.)
  2270.  
  2271.         int SendDragDrop(int msx,int msy,int kstate,char *name,
  2272.                          char *ext,long size,char *data)
  2273.              -> Daten per Drag&Drop-Protokoll an die Applikation senden,
  2274.                 der das Fenster unter dem Mauszeiger gehört
  2275.              -> Parameter:
  2276.                 msx,msy:  Mauskoordinaten
  2277.                 kstate:   Status der Umschalttasten
  2278.                 name:     Zeiger auf (Datei-) Namen der Daten oder NULL
  2279.                 ext[4]:   Zeiger auf Zeichenkette, die die Erweiterung
  2280.                           bzw. den Typ der Daten enthält
  2281.                 size:     Länge der Daten
  2282.                 data:     Adresse der Daten
  2283.              -> Rückgabewert:
  2284.                 NO_RECEIVER: Fenster oder Empfänger nicht gefunden bzw. 
  2285.                              applikationseigenes Fenster
  2286.                 NO_DD:       Drag&Drop-Pipe konnte nicht angelegt werden
  2287.                              (Betriebssystem unterstützt kein Drag&Drop!)
  2288.                 DD_NAK:      Empfänger unterstützt kein Drag&Drop
  2289.                 DD_EXT:      Empfänger kann Daten nicht empfangen (z.B.
  2290.                              unbekanntes Format)
  2291.                 DD_LEN:      Nicht alle Daten konnten übermittelt werden
  2292.                              oder zuwenig Speicher
  2293.                 DD_OK:       Alles in Ordnung
  2294.  
  2295.     18. Auskunftsfunktionen
  2296.         -------------------
  2297.  
  2298.         int appl_xgetinfo(int type,int *out1,int *out2,int *out3,int *out4);
  2299.             -> erweiterte appl_getinfo()-Routine, welche die Existenz von
  2300.                appl_getinfo() selbständig ermittelt
  2301.             -> Rückgabewerte wie bei appl_getinfo()
  2302.  
  2303.         int appl_getfontinfo(int font_type,int *height,int *id,int *type)
  2304.             -> Informationen über großen (font_type=0) oder kleinen
  2305.                System-Font (font_type=1) ermitteln
  2306.             -> Rückgabewerte:
  2307.                 height: Font-Höhe in Punkt
  2308.                 id:     Font-ID
  2309.                 type:   0 - System-Font
  2310.                         1 - FSM-Font
  2311.  
  2312.         int wind_xget(int w_handle, int w_field, int *w1, int *w2,
  2313.                       int *w3,int *w4);
  2314.             -> korrigierte wind_get()-Funktion für erweiterte Aufrufe unter
  2315.                Winx sowie MTOS und zukünftigen Erweiterungen (die in der
  2316.                Pure C-GEM-Library bis V1.1 enthaltene, optimierte Routine
  2317.                funktioniert nicht mit neueren Aufrufen)
  2318.  
  2319.         int get_dialog_info(int *fly_dials,int *win_dials,int *wins,
  2320.                             DIAINFO **top);
  2321.             -> Informationen über geöffnete Dialoge und Fenster ermitteln
  2322.             -> Rückgabewert: TRUE:  Ausgabe in beliebiges Fenster möglich
  2323.                              FALSE: Ausgabe nur in obersten Dialog 'top'
  2324.                              FAIL:  Keine Ausgabe möglich (z.B. Drop-Down-
  2325.                                     Menü heruntergeklappt oder Popup ge-
  2326.                                     öffnet)
  2327.                *fly_dials: Anzahl der geöffneten (fliegenden) Dialoge
  2328.                            (sofern fly_dials!=NULL)
  2329.                *win_dials: Anzahl der geöffneten Fenster-Dialoge (sofern
  2330.                            win_dials!=NULL)
  2331.                *wins:      Anzahl der geöffneten Fenster (sofern wins!=NULL)
  2332.                            inklusive der Fensterdialoge
  2333.                *top:       Zeiger auf obersten Dialog, falls Rückgabewert
  2334.                            gleich FALSE (sofern top!=NULL)
  2335.  
  2336.     19. Datei-/Pfadfunktionen
  2337.         ---------------------
  2338.  
  2339.         void drive_changed(int drive)
  2340.             -> Inhalt des Laufwerks 'drive' (0=A,1=B,2=C,...,-1=alle Lauf-
  2341.                werke) wurde verändert (SH_WDRAW-Nachricht wird (per
  2342.                XAccBroadCast) an alle Applikationen gesendet)
  2343.  
  2344.         char *GetFilename(char *path)
  2345.             -> Zeiger auf Dateiname des Pfades 'path' ermitteln. Enthält
  2346.                der Pfad keinen Dateinamen, so zeigt der Rückgabewert auf
  2347.                das Ende (Nullbyte) des Pfades
  2348.  
  2349.         char *GetExtension(char *path)
  2350.             -> Zeiger auf Erweiterungs des Dateinamens des Pfades 'path'
  2351.                ermitteln. Enthält der Pfad keinen Dateinamen oder keine
  2352.                Erweiterung, so zeigt der Rückgabewert auf das Ende
  2353.                (Nullbyte) des Pfades
  2354.  
  2355.         char *GetPath(char *path)
  2356.             -> Dateiname des Pfades 'path' wird entfernt und ein Zeiger
  2357.                auf das Ende des Pfades (Nullbyte) zurückgegeben
  2358.  
  2359.         int GetDrive(char *path)
  2360.             -> Laufwerk des Pfades 'path' ermitteln
  2361.             -> Rückgabewert: 0=A,1=B,2=C,...
  2362.  
  2363.         void MakeFullpath(char *dest,char *path,char *file)
  2364.             -> kompletten Pfadnamen aus Pfad 'path' (sofern path!=NULL,
  2365.                wobei der Pfad keinen abschließenden Backslash enthalten
  2366.                muß) und Datei 'file' erstellen und im String 'dest' zurück-
  2367.                geben. Wird für den Pfad 'path' NULL übergeben, so muß
  2368.                sich der Pfad bereits in 'dest' befinden!
  2369.  
  2370.         int FileSelect(char *title,char *path,char *fname,char *sel,
  2371.                        int no_insel)
  2372.             -> Dateiselector aufrufen, wobei diese Funktion automatisch
  2373.                erkennt, ob ein erweiterter Fileselector vorliegt.
  2374.             -> Parameter:
  2375.                title:    Titel des Fileselectors
  2376.                path:     Pfad (sowohl Ein- als auch Ausgabeparameter)
  2377.                fname:    vorgegebene Datei (Eingabe) bzw. ausgewählte Datei
  2378.                          (Ausgabe)
  2379.                sel:      Dateimaske oder NULL (in diesem Fall wird "*.*"
  2380.                          genommen)
  2381.                no_insel: keine vorgegebene Datei (no_insel!=0)
  2382.             -> Rückgabewert:
  2383.                TRUE:  Datei wurde ausgewählt
  2384.                FALSE: Keine Datei ausgewählt oder Fehler aufgetreten
  2385.  
  2386.     20. Verschiedene Funktionen
  2387.         -----------------------
  2388.  
  2389.         void MouseOn(void);
  2390.         void MouseOff(void);
  2391.             -> Mauszeiger an/-ausschalten. Diese Funktionen merken sich
  2392.                intern, ob der Mauszeiger bereits an- oder ausgeschaltet
  2393.                ist.
  2394.  
  2395.         void MouseArrow(void);
  2396.         void MouseCursor(void);
  2397.         void MouseBee(void);
  2398.         void MouseHourGlass(void);
  2399.         void MousePointHand(void);
  2400.         void MouseFlatHand(void);
  2401.         void MouseThinCross(void);
  2402.         void MouseThickCross(void);
  2403.         void MouseOutlineCross(void);
  2404.             -> Mausform einstellen
  2405.  
  2406.         int sl_key(int scan,int ascii)
  2407.             -> Aus Scan-Code 'scan' und ASCII-Code 'ascii' Tastencode
  2408.                für SLKEY-Struktur berechnen (bisher reines Ersetzungs-
  2409.                Makro)
  2410.  
  2411.         int scan_2_ascii(int scan,int state);
  2412.             -> Großbuchstabe eines Tastendrucks aus Scan-Code 'scan' und
  2413.                Status der Umschalttasten 'state' ermitteln
  2414.  
  2415.         int min(int val1,int val2);
  2416.             -> Minimum der Werte 'val1' und 'val2' berechnen und zurück-
  2417.                geben
  2418.  
  2419.         int max(int val1,int val2);
  2420.             -> Maximum der Werte 'val1' und 'val2' berechnen und zurück-
  2421.                geben
  2422.  
  2423.         void Min(int *var,int val);
  2424.             -> Minimum von der Variablen '*var' und dem Wert 'val'
  2425.                berechnen und in der Variablen '*var' speichern
  2426.  
  2427.         void Max(int *var,int val);
  2428.             -> Maximum von der Variablen '*var' und dem Wert 'val'
  2429.                berechnen und in der Variablen '*var' speichern
  2430.  
  2431.         void mfdb(MFDB *mfdb,int *bitmap,int width,int height,
  2432.                   int standard,int planes)
  2433.             -> Memory form definition block 'mfdb' initialisieren
  2434.             -> bitmap:       Zeiger auf Start der Bitmap
  2435.                width,height: Breite/Höhe der Bitmap in Pixeln
  2436.                standard:     Standardformat (1) oder geräteabhängiges
  2437.                              Format
  2438.                planes:       Anzahl der Farbebenen der Bitmap
  2439.  
  2440.         long mfdb_size(MFDB *mfdb);
  2441.             -> Speicherbedarf der Bitmap des Memory form definition
  2442.                block 'mfdb' berechnen
  2443.  
  2444.         char LowerChar(char ch)
  2445.         char UpperChar(char ch)
  2446.             -> Zeichen 'ch' in Klein-/Großbuchstaben umwandeln, wobei
  2447.                auch Umlaute beachtet werden
  2448.  
  2449.         void *GetMsgBuffer(long size)
  2450.             -> globalen Speicher (u.a. für XAcc-2/AV-Kommunikation) der
  2451.                Größe 'size' anfordern
  2452.             -> Rückgabewert wie bei Malloc()
  2453.  
  2454.     21. Definitionen häufig benötigter (Protokoll-) Konstanten
  2455.         ------------------------------------------------------
  2456.  
  2457.         XAcc-2-Protokoll:
  2458.         -----------------
  2459.         (genaue Bedeutung s. XAcc-2-Dokumentation)
  2460.  
  2461.         #define ACC_ID      0x400
  2462.         #define ACC_OPEN    0x401
  2463.         #define ACC_CLOSE   0x402
  2464.         #define ACC_ACC     0x403
  2465.         #define ACC_EXIT    0x404
  2466.  
  2467.         #define ACC_ACK     0x500
  2468.         #define ACC_TEXT    0x501
  2469.         #define ACC_KEY     0x502
  2470.         #define ACC_META    0x503
  2471.         #define ACC_IMG     0x504
  2472.  
  2473.         AV-Protokoll:
  2474.         -------------
  2475.         (genaue Bedeutung s. AV-Dokumentation 'VA_PROTO.H')
  2476.  
  2477.         #define AV_PROTOKOLL        0x4700
  2478.         #define AV_GETSTATUS        0x4703
  2479.         #define AV_STATUS           0x4704
  2480.         #define AV_SENDKEY          0x4710
  2481.         #define AV_ASKFILEFONT      0x4712
  2482.         #define AV_ASKCONFONT       0x4714
  2483.         #define AV_ASKOBJECT        0x4716
  2484.         #define AV_OPENCONSOLE      0x4718
  2485.         #define AV_OPENWIND         0x4720
  2486.         #define AV_STARTPROG        0x4722
  2487.         #define AV_ACCWINDOPEN      0x4724
  2488.         #define AV_ACCWINDCLOSED    0x4726
  2489.         #define AV_COPY_DRAGGED     0x4728
  2490.         #define AV_PATH_UPDATE      0x4730
  2491.         #define AV_WHAT_IZIT        0x4732
  2492.         #define AV_DRAG_ON_WINDOW   0x4734
  2493.         #define AV_EXIT             0x4736
  2494.  
  2495.         #define VA_PROTOSTATUS      0x4701
  2496.         #define VA_SETSTATUS        0x4705
  2497.         #define VA_START            0x4711
  2498.         #define VA_FILEFONT         0x4713
  2499.         #define VA_CONFONT          0x4715
  2500.         #define VA_OBJECT           0x4717
  2501.         #define VA_CONSOLEOPEN      0x4719
  2502.         #define VA_WINDOPEN         0x4721
  2503.         #define VA_PROGSTART        0x4723
  2504.         #define VA_DRAGACCWIND      0x4725
  2505.         #define VA_COPY_COMPLETE    0x4729
  2506.         #define VA_THAT_IZIT        0x4733
  2507.         #define VA_DRAG_COMPLETE    0x4735
  2508.  
  2509.         #define VA_OB_UNKNOWN       0
  2510.         #define VA_OB_TRASHCAN      1
  2511.         #define VA_OB_SHREDDER      2
  2512.         #define VA_OB_CLIPBOARD     3
  2513.         #define VA_OB_FILE          4
  2514.         #define VA_OB_FOLDER        5
  2515.         #define VA_OB_DRIVE         6
  2516.         #define VA_OB_WINDOW        7
  2517.  
  2518.         MTOS-Drag&Drop-Protokoll:
  2519.         -------------------------
  2520.         (genaue Bedeutung s. MTOS-Entwickler-Dokumentation)
  2521.  
  2522.         #define AP_DRAGDROP         63
  2523.  
  2524.         #define DD_OK               0
  2525.         #define DD_NAK              1
  2526.         #define DD_EXT              2
  2527.         #define DD_LEN              3
  2528.         #define DD_TRASH            4
  2529.         #define DD_PRINTER          5
  2530.         #define DD_CLIPBOARD        6
  2531.  
  2532.         #define DD_TIMEOUT          4000
  2533.  
  2534.         #define DD_NUMEXTS          8
  2535.         #define DD_EXTSIZE          32L
  2536.         #define DD_NAMEMAX          128
  2537.  
  2538.         #define DD_HDRMAX           (8+DD_NAMEMAX)
  2539.  
  2540.         Menü-Protokoll:
  2541.         ---------------
  2542.  
  2543.         #define WM_CLOSED           0x0016  ^U
  2544.         #define WM_FULLED           0x0017  ^#* ('*' auf Ziffernblock)
  2545.         #define WM_SAVE             0x1000  ^S
  2546.         #define WM_SAVEAS           0x1001  ^M
  2547.         #define WM_PRINT            0x1002  ^P
  2548.         #define WM_UNDO             0x1003  Undo
  2549.         #define WM_CUT              0x1004  ^X
  2550.         #define WM_COPY             0x1005  ^C
  2551.         #define WM_PASTE            0x1006  ^V
  2552.         #define WM_SELECTALL        0x1007  ^A
  2553.         #define WM_FIND             0x1008  ^F
  2554.         #define WM_REPLACE          0x1009  ^R
  2555.         #define WM_FINDNEXT         0x100a  ^G
  2556.         #define WM_HELP             0x100b  Help
  2557.         #define WM_DELETE           0x100c  Delete
  2558.  
  2559.         View-Protokoll:
  2560.         ---------------
  2561.         (genaue Bedeutung s. View-Dokumentation V1.04)
  2562.  
  2563.         #define VIEW_FILE       0x5600
  2564.         #define VIEW_FAILED     0x5601
  2565.         #define VIEW_OPEN       0x5602
  2566.         #define VIEW_CLOSED     0x5603
  2567.         #define VIEW_DATA       0x5604
  2568.         #define VIEW_GETMFDB    0x5610        #define VIEW_SETMFDB    0x5611        #define VIEW_MFDB       0x5612
  2569.  
  2570.         #define VIEWERR_ERROR   0
  2571.         #define VIEWERR_SIZE    1
  2572.         #define VIEWERR_COLOR   2
  2573.         #define VIEWERR_WID     3
  2574.         #define VIEWERR_MEM     4
  2575.  
  2576.         Clipboard-Protokoll:
  2577.         --------------------
  2578.         (s.a. Beschreibung der Funktion scrp_changed())
  2579.  
  2580.         Aufbau der Nachricht:
  2581.             msg[0]          = SC_CHANGED (80)
  2582.             msg[1]          = apID
  2583.             msg[2]          = 0
  2584.             msg[3]          = Bitmap des Dateiformats
  2585.                               (Parameter 'format' von scrp_changed())
  2586.             msg[4],msg[5]   = 4 Zeichen für die "beste" der abgespeicherten
  2587.                               Dateien (z.B. ".RTF"), damit beim Lesen mög-
  2588.                               lichst wenig Information verloren geht
  2589.                               (Parameter 'best_ext' von scrp_changed())
  2590.             msg[6],msg[7]   = reserviert (auf Null setzen!)
  2591.  
  2592.  
  2593.         Scan-Codes:
  2594.         -----------
  2595.  
  2596.         #define SCANESC     1       /* Esc */
  2597.         #define SCANTAB     15      /* Tab */
  2598.         #define SCANRET     28      /* Return */
  2599.         #define SCANDEL     83      /* Delete */
  2600.         #define SCANBS      14      /* Backspace */
  2601.         #define SCANENTER   114     /* Enter */
  2602.  
  2603.         #define SCANHELP    98      /* Help */
  2604.         #define SCANUNDO    97      /* Undo */
  2605.         #define SCANINS     82      /* Insert */
  2606.         #define SCANHOME    71      /* Clr/Home */
  2607.  
  2608.         #define SCANUP      72      /* Up */
  2609.         #define SCANDOWN    80      /* Down */
  2610.  
  2611.         #define SCANLEFT    75      /* Left */
  2612.         #define SCANRIGHT   77      /* Right */
  2613.  
  2614.         #define CTRLLEFT    115     /* Ctrl-Left */
  2615.         #define CTRLRIGHT   116     /* Ctrl-Right */
  2616.  
  2617.         #define SCANF1      59      /* F1 - F10 */
  2618.         ...
  2619.         #define SCANF10     68
  2620.  
  2621.         #define CTRLF1      84      /* CTRL-F1 - CTRL-F10 */
  2622.         ...
  2623.         #define CTRLF10     93
  2624.